Java异常体系

Java异常体系

Java异常体系结构

Java把异常当作对象来处理,并定义了一个基类java.lang.Throwable,作为所有异常的超类。

Throwable有两个子类ErrorException,分别表示错误和异常。Exception又分为运行时异常

RuntimeException和非运行时异常,又称为不检查异常和检查异常

Java异常体系_第1张图片

Error与Exception的区别

Error是程序无法处理的错误,比如OutOfMemoryErrorThreadDeath.Error发生时,

JVM一般会现在线程终止。Exception是程序本身可以处理的异常,程序中应当尽可能去处理。

运行时异常与非运行时异常的区别

运行时异常是不检查异常,程序中可以选择捕获处理,也可以不处理,一般运行时异常,是由程序逻辑错误引起的。运行时异常主要包括RuntimeException及其子类,如NullPointerExceptionIndexOutOfBoundException,

非运行时异常是必须处理的异常,如果不处理,程序就不能编译通过

非运行时异常时RuntimeException以外的异常,类型上都属于Exception类及其子类

异常的捕获与处理

Java异常处理主要涉及五个关键字,包括trycatchfinallythrowthrows

  • 异常处理的基本语法

    try{
           
        //程序代码
    }catch(异常类型 异常变量名) {
           
    }finally{
           
        //异常发生,方法返回之前,总要执行的代码
    }
    

    如果在执行程序代码的时候,抛出了catch指定的异常,会执行catch子句的相应处理逻辑。

    无论是否捕捉到异常,只要执行了try的程序代码,均会执行finally子句相应处理逻辑

    try、catch、finally三个语句块均不能单独使用,三者可以组成 try...catch...finallytry...catchtry...finally三种结构,catch语句可以有一个或多个,finally语句最多一个。

  • 多个catch的异常捕获

    按照程序书写顺序,从上至下匹配,仅仅会匹配一个catch,如果多个catch捕获的异常,存在继承关系,一般建议先捕获子类异常,再捕获父类异常

异常转译

所谓的异常转译就是将一种异常转换另一种新的异常,也许这种新的异常更能准确表达程序发生异常。 所有Throwable的子类在构造器中都可以接受一个Throwable对象作为参数,为转译提供了直接的支持

比如将SQLException转换为另一个新的异常DAOException

public class DAOException extends RuntimeException {
       
      public DAOException(String message, Throwable cause) {
       
          super(message, cause);  
      }  
}
//一个SQLException类型对象e转换为DAOException
DAOException daoEx = new DAOException("SQL异常", e);

异常链

异常链顾名思义就是将异常发生的原因一个传一个串起来,即把底层的异常信息传给上层,这样逐层抛出。
Java API文档中给出了一个简单的模型:

try {
       
	lowLevelOp();  
} catch (LowLevelException le) {
       
	throw (HighLevelException)  
	new HighLevelException().initCause(le);  
} 

当程序捕获到了一个底层异常le,在处理部分选择了继续抛出一个更高级别的新异常给此方法的调用者。这样异常的原因就会逐层传递。这样,位于高层的异常递归调用getCause()方法,就可以遍历各层的异常原因。这就是Java异常链的原理。异常链的实际应用很少,发生异常时候逐层上抛不是个好注意,上层拿到这些异常又能奈之何?而且异常逐层上抛会消耗大量资源,因为要保存一个完整的异常链信息.

参考文章

异常的概念和Java异常体系结构

finally代码块一定会执行吗?

你可能感兴趣的:(Java学习,java,exception,编程语言,jvm)