【Java基础】异常处理

2022-05-12 20:01:59 浏览数 (1)

本篇目录:

1、模拟运行异常 2、处理异常 3、抛出异常 4、finally关键字 5、自定义异常 6、异常的继承关系

Java中为异常提供的关键字有如下五个关键字:try,catch,finally,throw,throws

1 模拟运行异常

代码语言:javascript复制
int i = 1 / 0;
System.out.println(1);

上面第一行代码由于算术中除数不能为零,则会抛出算术运算异常。

运行结果如下:

代码语言:javascript复制
Exception in thread "main" java.lang.ArithmeticException: / by zero
  at exception.Main.main(Main.java:10)

数字1并没有输出,说明在第一行代码运行异常后,不会继续再向下运行,所以第二行代码就不会运行。

即异常发生后代码没有继续向下执行,而是停止了运行。

2 处理异常

那么我们如何处理这个异常呢,并且让程序不影响运行。

处理异常示例:

代码语言:javascript复制
try{
    int i = 1 / 0;
}catch (ArithmeticException exception){
    System.out.println("这是算术运行异常");
}
System.out.println(1);

运行结果如下:

代码语言:javascript复制
这是算术运行异常
1

在运行结果中数字1成功打印,说明异常被成功处理,并没有影响程序的正常执行。

3 抛出异常

除了使用try...catch关键字将异常捕获,还可以将异常抛出给上一级处理,即谁调用它就交给谁来处理这个异常。

如果没有调用关系,则将这个异常交给JVM处理,也就是运行Java字节码的虚拟机。

再如果JVM处理不了这个异常,那么JVM就会罢工,不会继续执行了。

3.1、抛出异常未处理

抛出异常示例:

代码语言:javascript复制
public static void main(String[] args){
    demoA();// 调用方法
    System.out.println(2);// 打印数字2
}

// 抛出算术异常
public static void demoA() throws ArithmeticException{
    int i = 1 / 0;// 算术异常
    System.out.println(1);// 打印数字1
}

在上述例子中,方法demoA出现异常,并抛出异常给main方法,但是main方法并没有捕获处理。

运行结果如下:

代码语言:javascript复制
Exception in thread "main" java.lang.ArithmeticException: / by zero
  at exception.Main.demoA(Main.java:11)
  at exception.Main.main(Main.java:5)

3.2、抛出异常并进行处理

抛出异常并进行处理示例:

代码语言:javascript复制
public static void main(String[] args){
    try {
        demoA();// 调用方法
    }catch (ArithmeticException exception){
        System.out.println("处理demoA抛出的异常");
    }
    System.out.println(2);// 打印数字2
}

// 抛出算术异常
public static void demoA() throws ArithmeticException{
    int i = 1 / 0;// 算术异常
    System.out.println(1);// 打印数字1
}

执行结果:

代码语言:javascript复制
处理demoA抛出的异常
2

数字2被成功打印,但是数字1没有,因为打印数字1的前一行代码出现了异常,而这个方法中没有对这个异常进行捕获处理,而是抛出了异常,那么这个方法到抛出异常后就停止执行了。

4 finally关键字

在异常处理中,当发生异常时,才会执行catch中的代码。相反,没有异常就不会执行。而有很多的情景下是需要无论执行有无异常都需要执行的代码,那finally就是干这个工作的。

示例:

代码语言:javascript复制
try {
    int i = 1 / 0;// 算术异常
} catch (ArithmeticException exception) {
    System.out.println("算术异常");
}finally {
    System.out.println("finally代码块");
}

5 自定义异常

在实际开发中,我们难免会遇到一些需要我们手动抛出的异常信息,尤其是分模块开发中,而且需要告诉我们的上一级代码遇到的问题。

5.1、简单的自定义异常

代码语言:javascript复制
public class TestException extends Exception {
    public TestException(String message){
        super(message);
    }
}

这就是一个最简单的自定义异常。

步骤:①定义一个异常类。②继承Exception类。③编写构造方法,并调用父类的构造方法将异常信息输出。

5.2、抛出自定义异常

代码语言:javascript复制
public static void demoA() throws TestException{
    throw new TestException("抛出自定义异常");
}

捕获的异常信息:

代码语言:javascript复制
exception.TestException: 抛出自定义异常
  at exception.Main.demoA(Main.java:13)
  at exception.Main.main(Main.java:6)

6 异常的继承关系

在我们自定义异常时也看到了,其实异常也是一个类,以我们自定义的异常类为例,它的继承关系如下:

所有的异常都是从Throwable类继承来的,而Throwable类有两个子类,分别是ExceptionError

Exception是程序本身可以处理的异常,而Error是JVM本身的错误,通过代码没有办法被捕获并处理。

0 人点赞