java基础类库学习(四.2)异常处理的陷阱

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/strivenoend/article/details/83625309

前言

java的异常类Exception继承自非正常情况类Throwable,异常类下又分为两大类:checked异常和runtime异常,

其中发生checked异常的类如果不做处理程序会发生编译错误,导致程序中断编译

而runtime异常的类只有在运行阶段才会发生,如果不做处理,程序会终断运行

为保证编译的顺利执行,java规定开发者必须在程序内处理checked异常的实例,对其进行捕获处理或者将其抛出由上一级调用者处理,

而runtime异常则可不进行处理

陷阱?

1使用finally块正确关闭资源的方式

finally{

if(ois!=null){

try{

ois.close();

}

catch(Exception e){

}
}

}

//关闭物理资源必须显示关闭,因为垃圾回收机制不负责回收物理资源

//使用finally块来显示关闭物理资源,保证关闭操作总是被执行

//为防止空指针异常,关闭物理资源前保证引用该资源的变量不为null

//为保证关闭资源时引发的异常不会影响其他资源的关闭,应为每个资源的关闭使用try/catch块

谁说finally块必须执行?

try-catch-finally块中,finally块在以下几种情况将不会执行。

(1)finally块中发生了异常。

(2)程序所在线程死亡。

(3)在前面的代码中用了System.exit();,停止当前线程,程序退出

(4)关闭了CPU

finally块如果不执行那么物理资源怎么释放?

其中执行System.exit()语句后,虚拟机在退出时也会执行物理资源的清理操作,即虽然未执行finally操作也还是进行了物理资源的关闭,这种关闭资源的方式时通过关闭钩子的方式实现的,即程序需要显示的注册关闭钩子,在关闭钩子中实现物理资源的关闭,虚拟机在退出时会自动执行关闭钩子

有如下的迷惑代码,为了保证finally块总是被执行你就会清醒一些了?

try{

throw new Exception("");

}

finally{

return 0;

}

系统执行throw语句时。为保证fianlly块总被执行,因此先不立刻抛出异常,先检查有没有finally块,若有则执行,return了方法结束,将不会抛出异常,程序正常编译运行

在catch块内尽可能对异常进行修复,再次调用方法避免异常继续产生,否则有可能会导致循环递归,发生StackOverFlow错误

猜你喜欢

转载自blog.csdn.net/strivenoend/article/details/83625309