异常处理
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了异常处理相关的知识,希望对你有一定的参考价值。
try catch final执行顺序
- final必然执行
- 如果出现异常,会遍历catch执行匹配的
return的问题
return返回值使用栈保存,所以会
- 在try中return并不会真的结束,而要等final执行完毕
- 在return语句后更改return的变量值无法对实际值产生影响
- try或catch中的return会被final中的return覆盖
- 不应在finally中return和抛出新的异常 因为会导致原有的异常或是返回被覆盖
缺陷
在finally中return或是抛出新的异常会导致原本的返回或者异常被覆盖,导致异常丢失
异常的限制
覆盖方法的时候只能抛出在基类方法的异常说明里列出过的异常,但是基类异常说明中的异常也不一定都要出现.
这点与继承中接口只能变大正好相反.
构造器
如果在构造器中执行了打开文件之类的操作,出现异常将不能被正确处理,因此编写构造器一定要特别小心.
使用finally无法正常清理的原因在于,构造器执行一半出现异常导致并没有初始化完成,而finaly中又会执行清理,这就会出现错误.
对于构造阶段可能出现异常且要求清理的类,可以使用嵌套的try-catch.
try{
InputFile in = new InputFile("clean.java");
try{
// 文件读取
}
catch(Exception e){
// lalala
}finally{
//清理
}
}catch(Exception e){
//lalala
}
这样就可以保证,当InputFile没有打开时进入外层catch不进行清理,而在内层出现异常时正常清理
这种用法在构造器不抛出任何异常时也应该运用,基本规则为:在创建需要清理的对象之后,立即进入一个try-cache-finally语句块.
异常匹配
抛出异常之后,异常处理系统会按照代码顺序找出最近的处理程序,找到之后就不再继续查找.查找时并不要求完全匹配,派生的对象也可以匹配基类的处理程序
以上是关于异常处理的主要内容,如果未能解决你的问题,请参考以下文章
java.util.MissingResourceException: Can't find bundle for base name init, locale zh_CN问题的处理(代码片段