前言
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错误