概述

异常就是 Java 程序在运行过程中出现的错误

异常的继承关系:

rk3588 镜像update备份_异常信息

JVM 如何处理异常

main 函数收到这个问题时,有两种处理方式:

  • 自己将该问题处理,然后继续运行
  • 自己没有针对的处理方式,只能交给调用 main 的JVM来处理
    - JVM 有一个默认的异常处理机制,即将该异常的名称,异常的信息,异常出现的位置打印在控制台上,同时将程序停止运行。

异常处理方式

1、try…catch…finally

try:用来检测异常
catch:用来捕获异常
finally:用来释放资源
public class Demo1_Exception {
	public static void main(String[] args) {
		Demo d = new Demo();
		try {
			int x = d.div(10, 0);
			System.out.println(x);
		}catch(ArithmeticException e) {
			System.out.println("除数出错啦");;
		}
	}
}

class Demo{
	public int div(int a, int b) {
		return a / b;
	}
}

处理多个异常:

public class Demo2_Exception {
    //try catch 处理多个异常
    public static void main(String[] args) {
        int a = 10;
        int b = 0;
        int[] arr = {11, 22, 33, 44};

        try{
            arr = null;
            System.out.println(arr[10]);
        }catch(ArithmeticException e){
            System.out.println("除数不能为0");
        } catch (ArrayIndexOutOfBoundsException e){
            System.out.println("索引越界了");
        } catch (Exception e){
            System.out.println("出错了");
        }
    }
}

只要一个异常触发,程序停止,后面的不会执行。而且在这种情况下,一般小的异常放前面,大的异常放后面,因为根据多态的原理,如果大的异常放前面,那么后面的异常都不会被接收,没有意义。

实际开发中,一般这么写:

public class Demo2_Exception {
    //try catch 处理多个异常
    public static void main(String[] args) {
        int a = 10;
        int b = 0;
        int[] arr = {11, 22, 33, 44};

        try{
            arr = null;
            System.out.println(arr[10]);
        }catch(Exception e){
			e.printStackTrace();
    }
}

编译期异常和运行期异常的区别

Java中的异常被分为两大类,编译时异常和运行时异常。

  • 所有的RuntimeException类及其子类的实例被称为运行时异常
  • 其它的异常就是编译时异常

编译时异常:Java程序必须显示编写异常处理方式,否则程序就会发生错误,无法通过编译。(未雨绸缪)

try{
	FileInputStream fis = new FileInputStream("xxx.txt");  //这个异常是为了防止文件读不到
} catch(Exception e){
	e.printStackTrace();
}

运行时异常:就是程序员所犯的错误,必须要去修改代码,或像编译时异常那样显示处理

Throwable 的几个常见方法

getMessage()  //获取异常信息,返回字符串
toString()  //获取异常类名和异常信息,返回字符串
printStackTrace()  //获取异常类名和异常信息,以及异常出现在程序中的位置。返回值void
public class Demo3_Throwable {
    public static void main(String[] args) {
        try{
            System.out.println(1 / 0);
        } catch (Exception e){
            System.out.println(e.getMessage());
            System.out.println(e);
            e.printStackTrace();
        }
    }
}

输出:

rk3588 镜像update备份_rk3588 镜像update备份_02