异常处理

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语句块.

异常匹配

抛出异常之后,异常处理系统会按照代码顺序找出最近的处理程序,找到之后就不再继续查找.查找时并不要求完全匹配,派生的对象也可以匹配基类的处理程序





原文地址:https://www.cnblogs.com/renluxiang/p/46486c3a4152315ad4f0cb73f25da549.html