6、异常处理

异常处理

所有异常的超类:java.lang.Throwable,分为Error和Exception两大类,前者是致命的,一般会终止线程,后者应该尽可能处理

程序一旦发生异常,则,异常点后的语句将停止执行。

如果不存在这种异常的捕获语句,则,以后的代码都将停止执行,程序“崩溃”,由JVM接手处理异常;如果存在,则,转而执行异常捕获语句块中的代码;并继续执行异常捕获语句块的后续代码,程序不会崩溃!

有三种情况:

  1. 发生异常无捕获:异常后面的语句都不执行
  2. 捕获但无异常:正常执行代码(除了catch的代码)
  3. 捕获发生异常:执行try发生异常的语句和catch的语句和finally语句(如果存在)以及try-catch后的语句(try中发生异常的语句后将跳过去执行catch语句)

1.运行时异常和非运行时异常

  • 检查性异常(非运行时异常):编程时检查的,用户错误或问题引起的异常,这是程序员无法预见的。例如要打开一个不存在的文件时,这种异常编译器大多会提示我们
  • 运行时异常:运行时检查的,可能被程序员避免的异常,这些异常可以再编译时被忽略,例如:1/0
  • 错误ERROR:错误是脱离程序员控制的问题,大多数是虚拟机生成并抛出,通常在代码中被忽略,例如:栈溢出,Java虚拟机运行错误

编译器要求程序员必须对非运行时异常(又称为检查性异常)进行“捕获”,否则不能通过编译,而运行时异常编译器不要求捕获

2.自定义异常

用Exception类可以派生出“检查类异常”类

用RuntimeException可以派生出“运行时异常”类

通常建议应以检查类异常,可以强制程序员捕获处理

给我们的方法加上异常处理:

public class ExceptionGeekLee extends Exception {

    public ExceptionGeekLee() {
        System.out.println("a不能大于10");
    }

}

public class Student  {
    static void test(int a) throws ExceptionGeekLee {
        if (a > 10){
            throw new ExceptionGeekLee();
        }
    }
}
public class Main {
    public static void main(String[] args) {

        try {
            Student.test(11);
        } catch (ExceptionGeekLee e) {
        }
    }
}

结果:

我们在调用增加了异常的方法后,需要进行处理:捕获或者抛出

3. 异常捕获和抛出的选择

简单的处理异常的原则:能处理则处理,不能处理则抛出。

一般来说,对于某种异常,如果本方法有处理他的安排,那么就捕获;

一种情况是,如果这种异常不影响后续代码的逻辑和执行,那么捕获什么都不处理即可;

另一种情况是,严重影响后续代码执行,那么就把这个异常抛出。

4. fianlly关键字

这个关键字是在catch后的代码块,不管发不发生异常,都会执行的代码块,他的意义是:在发生异常后,做一些必要的操作,如:关闭打开的资源等等。

posted @ 2023-03-06 12:46  Geek李  阅读(80)  评论(0)    收藏  举报