Java中的异常处理

异常的分类

Java通过面向对象的方式对异常进行处理,Java把异常按照不同的类型进行分类。所有异常类的基类是Throwable类,两大子类分别是Error和Exception:

  • Error是程序无法处理的错误,例如OOM等
  • Exception是程序本身可以进行处理的异常,分两大类运行时异常(RuntimeException)检查异常(Checked Exception),检查型异常需要使用try, catch和finally关键字在编译期进行处理,否则编译器会报错
    image.png

finally代码块的执行

无论是否捕获异常,finally里的代码块都会被执行,涉及 break 及 continue 语句的时候,finally 子句也会得到执行。在以下几种特殊情况下,finally 块不会被执行:

  • 在 finally 语句块中发生了异常。
  • 在前面的代码中用了 System.exit()或者已经return返回 退出程序。
  • 程序所在的线程死亡。
  • 关闭 CPU

return和finally的执行

参考: Java基础——finally return执行的先后顺序

  • return语句先执行,不过没有立即返回,而是去执行finally语句,等finally语句执行完了,return语句再返回结果!
  • finally块中的return语句会覆盖try块中的return返回

throw 和 throws 的区别?

  • throw用于方法内部,throws用于方法声明上
  • throw后跟异常对象,throws后跟异常类型
  • throw后只能跟一个异常对象,throws后可以一次声明多种异常类型

final、finally、finalize 有什么区别?

  • final:是修饰符,如果修饰类,此类不能被继承;如果修饰方法和变量,则表示此方法和此变量不能在被改变,只能使用。
  • finally:是 try{} catch{} finally{} 最后一部分,表示不论发生任何情况都会执行,finally 部分可以省略,但如果 finally 部分存在,则一定会执行 finally 里面的代码。
  • finalize: 是 Object 类的一个方法,在垃圾收集器执行的时候会调用被回收对象的此方法

异常处理

参考自阿里巴巴《Java规范手册》

  • 不要捕获 Java 类库中定义的继承自 RuntimeException 的运行时异常类,如:IndexOutOfBoundsException / NullPointerException,这类异常由程序员预检查来规避,保证程序健壮性
  • 捕获异常是为了处理它,不要捕获了却什么都不处理而抛弃之
  • 有 try 块放到了事务代码中, catch 异常后,如果需要回滚事务,一定要注意手动回滚事务
  • 不能在 finally 块中使用 return, finally 块中的 return 返回后方法结束执行,不会再执行 try 块中的 return 语句
  • 做到精准区分异常类型,避免对大段代码进行 try-catch,避免使用Exception抛出。