Java异常处理机制

412 阅读3分钟

异常:是指阻止当前方法或者作用域继续执行的问题 ——《Think in Java》

当程序出现了异常,方法终止执行,我们需要去处理这个异常以使程序正常运行

Java中的异常处理机制,其实就是当代码出现逻辑错误时,尽可能的返回出错信息,帮助我们定位出错位置

异常体系结构

image.png Throwable 是整个异常处理机制的最高父类,它有两个子类 ErrorException

Error:程序无法处理的严重错误,我们不作处理

  • 这种错误一般来说与操作者无关,并且开发者与应用程序没有能力去解决这一问题,通常情况下,JVM会做出终止线程的动作

Exception:异常可以分为运行时异常和编译时异常(非运行时异常)

  • RuntimeException:编译时通过,运行时出错

  • OtherException:在编译期间,编译器检测到某段代码可能会发生某些问题,需要程序员提前给代码做出错误的解决方案。否则编译是不能通过的

此时FileReader中出现的报错就是编译时异常,我们需要提前对可能出现的异常进行处理

image.png

以下代码会出现运行时异常,编译期间正常,运行代码出现报错

int arr[]={1,2,3};
System.out.println(arr[4]);

image.png

处理异常方式

Java对异常的默认处理方式: 将问题抛出给上一级

当出现异常的时候 Java会根据问题的异常类 创建一个实例对象 然后将该对象抛给上一级

public static void main(String[] args) {
    method();
}

public static void method(){
    System.out.println(10/0);
}

运行代码出现以下报错信息

image.png

当执行到method里面的方法时,出现异常的运算条件,创建出ArithmeticException对象,抛给调用这个方法的上一级也就是method方法,method方法里面没有处理异常,接着将异常抛给上一级也就是main方法,接着抛给jvm,jvm拿到问题之后,打印错误的位置和原因。

  1. 问题可以自己处理:try catch处理 不会影响后续代码的执行

  2. 问题不能自己处理:throws抛出处理

try catch:

int arr[]={1,2,3};
System.out.println(arr[4]);
System.out.println("后续代码执行......");

代码遇到异常之后不会执行后续代码,直接报错

image.png

try {
    int arr[]={1,2,3};
    System.out.println(arr[4]);
} catch (ArrayIndexOutOfBoundsException e) {
    System.out.println("数组越界");
}
System.out.println("后续代码执行......");

使用try catch处理代码 后续代码正常执行

image.png

throws:

//定义people类 属性:age及其set get方法
People p = new People();
p.setAge(-20);
System.out.println(p.getAge());

年龄为-20明显是不合理的 改造一下set方法

public void setAge(int age) {
    if(age>=0){
        this.age = age;
    }
    else {
        System.out.println("年龄有误");
    }
}

image.png

get方法获取的数据为默认值 0 ,出现的默认值 0 也是不合理的

假设people是我们编写的,其他人调用people,调用者输入年龄为负数,这不是我们自己可以控制的,这时候就需要抛出异常

throw 将异常对象抛给调用者

throws 告知调用者此方法存在异常 对方法进行声明

public void setAge(int age) throws Exception {
    if(age>=0){
        this.age = age;
    }
    else {
        throw new Exception("年龄有误");
    }
}

image.png

image.png

此外我们还可以自定义异常类,只需要继承Exception类即可