Java基础——异常

文章目录

  • 1 概述
  • 2 异常体系
  • 3 常见的运行时异常
  • 4 异常默认执行流程
  • 5 处理异常的方式
  • 5.1 抛出异常
  • 5.2 处理异常
  • 6 自定义异常
  • 7 总结

1 概述

异常是程序在“编译”或者“执行”过程中可能出现的问题,所以可以分为编译时异常和运行时异常。
异常一旦出现而没有处理,则程序会退出JVM虚拟机而终止。

2 异常体系

Java基础——异常_第1张图片
异常体系都继承自Throwable类,下面分为Error错误和Exception异常,而Exception主要分为RuntimeException运行时异常和其他的编译时异常。
运行时异常:运行时期出现,编译不会报错,难以发现
编译时异常:编译时报错,不修改无法编译通过

3 常见的运行时异常

  • 数组越界异常:ArrayIndexOutOfBoundsException
    数组下标超出数组范围的时候报此异常
  • 空指针异常:NullPointerException
    对象为null,但是调用了其方法,就会报空指针
  • 数学操作异常:ArithmeticException
    数学计算异常,如0作被除数
  • 类型转换异常:ClassCastException
    强转时转换成了不合理的类型
  • 数字转换异常:NumberFormatException
    比如字符串转数字,但是字符串表示的不是数字

4 异常默认执行流程

  • 遇到一个异常,自动创建对应的异常对象
  • 异常抛给调用者,由于调用者没有处理,继续抛给JVM虚拟机
  • 虚拟机接收异常对象后,打印堆栈信息
  • 从调用点结束程序
    默认的异常处理机制会导致程序直接死亡,所以需要自己去处理异常,保证程序的继续执行。

5 处理异常的方式

  • 第一种是抛出给调用者,让调用者去处理
  • 第二种是自行处理,不抛出异常
    其实上面的方式中,最终都需要对异常进行捕获和处理。

5.1 抛出异常

public static void main(String[] args) throws FileNotFoundException {
    InputStream is = new FileInputStream("./test.txt");
}

异常抛出给调用者处理,如果最终没有处理者,则会抛给JVM进行默认的处理。

5.2 处理异常

public static void main(String[] args) {
    try {
        InputStream is = new FileInputStream("./test.txt");
    } catch (FileNotFoundException e) {
        e.printStackTrace();
    }
    System.out.println("hello");
}

使用try-catch进行处理,捕获异常处理后,后续的代码可以正常执行。
多种一场,则拥有duo个catch,虽然可以将catch合并成一个父类进行捕获,但是不推荐,理应不同的异常不同的处理方式。

最规范的做法是层层上抛异常,在最外层调用的时候处理异常,这样每层都能知道代码会有异常出现,而且最终也是处理了一场。

6 自定义异常

处理系统的异常外,也可以自定义异常类。
步骤为:

  1. 定义一个类继承Exception或者RuntimeException,继承前者为编译时异常,继承后者为运行时异常
  2. 重写构造器
  3. 在出现异常的地方通过throw new XXXException抛出异常对象
public class Main {
    public static void main(String[] args) {
        try {
            throw new TestException("test excption");
        } catch (TestException e) {
            e.printStackTrace();
        }
        System.out.println("hello");
    }
}

class TestException extends Exception {
    public TestException(String msg) {
        super(msg);
    }
}

7 总结

  • 异常都继承自Throwable类
  • Throwable类下分Error错误和Exception异常
  • Error是系统自身运行错误,无法处理
  • Exception分为运行时异常和编译时异常
  • 编译时异常在编译时报出,不解决代码编译不过
  • 运行时异常在运行时报出,不易察觉,通常是代码编写问题。
  • 可以通过抛异常和try-catch捕获异常处理
  • 如果系统异常不满足需求,可以自定义异常类,只需继承Exception类或者RuntimeException类,继承前者为编译时异常,继承后者为运行时异常

你可能感兴趣的:(#,Java基础知识,java,python,开发语言)