Java异常机制

1,077 阅读3分钟

什么是异常?

异常是指程序运行过程中由于外部问题导致的程序异常事件,产生的异常会中断程序的运行。在Java中,异常本身就是一个对象,产生异常就是产生一个异常对象。

Java中产生异常的三个原因

  1. Java内部错误发生异常,Java虚拟机产生的异常。
  2. 编写的程序中存在错误所产生的异常,如数组越界异常、空指针异常等。这种异常被称为运行时异常,即非受检异常,在编译期是感知不到的。
  3. 通过throw语句手动生成的异常,这种异常被称为受检异常,用来告知该方法的调用者一些必要的信息。

Java中异常处理机制

  1. 捕获异常
  2. 抛出异常

Java中的异常类

在Java中所有的异常类都是java.lang.Throwable类的子类,Throwable处于异常类的最顶层。Throwable类下面有两个分支,分别为ExceptionError,Exception下又有两个分支为(RuntimeExceptionCheckedException)

  1. Exception: 表示程序可以处理的异常,可以捕获并且可能恢复
  • RuntimeException(运行时异常):Error以及RuntimeException以及子类都是非受检异常,java编译器在编译时,不会提示和发现这样的异常,不会要求程序员在程序里处理这些异常,对于这些异常,我们应该去修正代码,而不是通过异常去处理。
  • CheckedException(受检异常):一般是外部错误,这种异常都发生在编译阶段,Java 编译器会强制程序去捕获此类异常,即会要求你把这段可能出现异常的程序使用try{}catch{}去捕获或者使用throws在方法后面声明抛出它,否则编译不通过
  1. Error: Error表示程序应用程序本身无法克服和恢复的一种严重问题,程序只能瘫痪,例如内存溢出和线程死锁等问题。

image.png

throws 和 throw 的区别

  • 位置不同。throws是用在方法函数头,后面跟的是异常类,而throw是用在方法体中的,后面跟的是异常对象
  • 功能不同。throws是用来声明异常的,让调用者只知道该方法中可能出现的问题,使它的调用者知道使用该方法时需要捕获这个异常,而自己不具体处理。throw是用来抛出具体的问题对象,执行到 throw,功能就已经结束了,跳转到调用者,并将具体的问题对象抛给调用者,。throws 表示出现异常的一种可能性,并不一定会发生这些异常;throw 则是抛出了异常,执行 throw 则一定抛出了某种异常对象。
throws:
public int div (int i,int j) throws ArithmeticException{
    int temp = i/j;
    return temp;
}

public static void main(String[] args) {
    try{
        div(1,0);
    }catch(ArithmeticException e){
        System.out.println(e);
    }
        
}

throw:
public static void main(String[] args) {
    int i = 1;
    int j = 0;
    try{
        if(j==0)
        throw new ArithmeticException();//通过throw抛出异常
    }catch(ArithmeticException e){
        System.out.println(e);
    }
}

自定义异常类

在自定义异常时,编写自己的异常类需要注意一下几点:

  • 所有的异常类都必须是Throwable的子类。
  • 如果希望自定义一个受检异常,则需要继承CheckedException类
  • 如果希望自定义一个运行时异常,则需要继承RuntimeException类

finally、finalize、final

  • finally:finally是捕获异常try{}catch{}finally{}语句块中的一部分,finally{}代码块中的代码一定会被执行(前面try{}、catch{}代码块中没有return语句的前提下),常用于释放资源。
  • finalize: finalize是Object中的一个方法,垃圾回收器删除对象之前会调用这个对象的finalize()方法
  • final:是一个修饰符,final修饰的类不能被继承,被final修饰的方法不能被重写,被final修饰的变量初始化之后不能被修改(不一定)。