异常处理详解

异常是一个事件,发生在程序运行期间,干扰了正常运行,有的是因为用户错误引起,有的是程序错误引起的,还有其它一些是因为物理错误引起的。

1.异常体系结构

异常处理详解_第1张图片

  • 所有异常继承自Throwable,分为错误Error和异常Exception;
  • Error,它表示不希望被程序捕获或者是程序无法处理的错误;Exception,它表示用户程序可能捕捉的异常情况或者说是程序可以处理的异常;
  • Error和Exception的区别:Error通常是灾难性的致命的错误,是程序无法控制和处理的(例如:JVM虚拟机运行错误、类定义错误),当出现这些异常时,Java虚拟机(JVM)一般会选择终止线程;Exception通常情况下是可以被程序处理的,并且在程序中应该尽可能的去处理这些异常。
  • Java异常又可以分为不受查异常和受查异常;
  • RuntimeException和Error属于非受查异常,其他都属于受查异常,受查异常要么使用try-catch语句进行捕获,要么用throws子句抛出,否则编译就不通过;

2.异常处理机制

2.1抛出异常

异常情形阻止当前方法或作用域继续执行,无法再继续下去了,所以要从当前环境中跳出,并把问题提交给上一级环境,这就是抛出异常时所发生的事情;
例如:检查person对象是否被初始化,可以创建一个代表错误信息的对象,并将它从当前环境中抛出,把错误信息传播到更大环境中;

if(person == null){
    throw new NullPointerException();
}

一个throws子句列举了一个方法可能引发的所有异常类型;

public void info() throws Exception
{


}

throw和throws的区别:throw语句用在方法体内表示抛出异常由方法体内的语句处理,执行throw一定是抛出了某类异常;throws用在方法声明,该方法的调用者必须对其异常进行处理,throws代表可能会出现某种异常,但不一定会发生;

2.2捕获异常

异常捕获的是一段可能出现异常的代码,并且后面跟着处理异常的代码;

try {
    
}catch (Exception e) {
    e.printStackTrace() ;//在命令行打印异常信息在程序中出错的位置及原因
}finally {
    
}
  • Java运行时系统负责寻找匹配的catch子句来捕获异常;若有一个catch语句匹配到了,则执行该catch块中的异常处理代码;
  • 使用多重的catch语句:很多情况下,由单个的代码段可能引起多个异常。处理这种情况,我们需要定义两个或者更多的catch子句,每个子句捕获一种类型的异常,当异常引发时,每个catch子句被依次检查;
  • 嵌套try语句:try语句可以被嵌套;一个try语句可以在另一个try块的内部;每次进入try语句,异常的前后关系都会被推入堆栈;

2.3五个关键字

  • try --用于监听;将可能抛出异常的代码放在try语句块之内,try语句块内发生异常时,异常就被抛出;
  • catch – 用于捕获异常;
  • finally – finally语句块总是会被执行;只有finally块执行完之后,才会回来执行try或者catch块中的return或者throw语句,如果finally中使用了return或者throw等终止方法的语句,则不会跳回执行,直接终止;
  • throw – 用于抛出异常;
  • throws – 用在方法签名中,用于声明该方法可能抛出的异常;

3.异常对程序性能影响

try-catch块会产生额外的开销,因为JVM在处理try-catch块的时候,会影响到JVM对代码的优化;
Java每实例化一个Exception,都会记录当前栈中发生这个异常的位置等各种信息,开销很大,如果发生的比较频繁也会效率低下;

你可能感兴趣的:(异常处理详解)