异常深入剖析

try{ ... } catch(Exception e){ ... } finally{ ... }
  • try:是用来监测可能会出现异常的代码段。
  • catch:是用来捕获 try 代码块中某些代码引发的异常,如果 try 里面没有异常发生,那么 catch 也一定不会执行。在 Java 语言中,try 后面可以有多个 catch 代码块,用来捕获不同类型的异常,需要注意的是前面的 catch 捕获异常类型一定不能包含后面的异常类型,这样的话,编译器会报错。
  • finally:不论 try-catch 如何执行,finally 一定是最后执行的代码块,所有通常用来处理一些资源的释放,比如关闭数据库连接、关闭打开的系统资源等。

需要注意的是 Java 虚拟机会从上往下匹配错误类型,因此前面的 catch 异常类型不能包含后面的异常类型。

错误试例

try {
  // ...
  int i = Integer.parseInt(null);
} catch (Exception e) {
}
  • 尽量不要捕捉通用异常,也就像Exception这样的异常,而是应该捕获特定异常,这样更有助于你发现问题。
  • 不要忽略异常,像上面的这段代码只是加了catch,但没有进行任何的错误处理,信息就输出了,这样在程序中出现问题的时候,根本找不到问题出现的原因。

异常处理对程序性能的影响

异常处理固然好用,但不能滥用

  • try-catch代码段会产生额外的性能开销,它往往会影响JVM对代码的优化,因此建议仅捕获有必要的代码段,尽量不要一个大的try包住整段的代码。
  • java每实例化一个Exception,都会对当时的栈进行快照,这是一个相对比较重的操作。如果非常频繁,开销不可忽略。

你可能感兴趣的:(异常深入剖析)