Java异常处理

Exception和Error的区别

Exceception和Error都继承自Throwable类,在Java中只有声明为Throwabel类或者它的子类才能进行捕获或者抛出,
当然捕获和抛出基本都是对于Exception而言的,这里就说一下Exception和Error的区别
首先,Error通常是导致程序不正常的错误,很难被捕获同时也就很难被恢复,比如常见的NoClassDefError和
OutMemoryError都是如此

Exception是异常而不是错误,Exception是设计出来对有可能发生错误的程序进行捕获并且恢复,Eception分为两类,
编译期异常和运行期异常,编译期异常往往是要求捕获的,不捕获的话会在编译期报错导致程序无法运行下去,
比如InterruptException ,IOException,另外一种是运行期异常,这些异常不要求必须捕获,可以正常通过编译期,只有在
程序运行期间可能会发生错误,这时候会抛出运行期异常,比如NullPointerException,ArrayIndexOutBoundException
 这里有个常见的问题  就是ClassNotFoundException和NoClassDefError,这里是跟Java的类加载机制有关
ClassNotFoundException往往是发生在编译期,使用Class.forName,在类路径下找不到相关的类,就会抛出这个异常
NoClassDefError则是发生在运行期的错误,在编译期可以正常编译通过,但是在运行期却找不到对应的类

Java中对待捕获错误往往应该注意两点:
1.捕获异常要具体,不能泛泛的捕获Exception了事,这样不利于出错时候的异常分析
2.不能忽略异常,有时候有人会在捕获异常后,字Catch中什么都不做,这样忽略了异常信息,在后面排错的时候更是无从下手
另外,频繁的try-catch-finally十分繁琐,有时候我们还要在finally中再次try-catch,在JDK7中,java推出了try-with-resource这种模式,
当需要关闭的资源实现了AutoCloseabel时,执行完try中的代码块后会自动调用close方法,这样简化了我们的写法

关于异常处理的性能问题
1.try-catch代码块会产生额外的性能开销,它会影响JVM对应代码的优化,所以应该只对需要的代码进行try-catch,而不是将所有的代码都放到try代码块中
2.抛出Exception的时候,JVM会对当前的栈进行快照,方便后期异常排除,所以应该避免频繁的抛出Exception

你可能感兴趣的:(java)