Java复习笔记-异常Exception体系知识点

102 阅读3分钟

Java异常分为两大类:

检查型异常(CheckedException):编译器强制要求程序员进行捕获处理的异常,比如:IOException、SQLException等
非检查型异常(UncheckedException):编译器不要求强制捕获的异常,比如RuntimeException及其子类

RuntimeException的子类

  1. ArithmeticException:当出现异常的运算条件时,抛出此异常。例如,一个整数"除以零"时,会抛出该异常。
  2. NullPointerException:当应用程序试图在需要对象的地方使用null时,抛出该异常。
  3. ArrayIndexOutOfBoundsException:用非法索引访问数组时抛出的异常。如果索引为负或大于等于数组大小,则该索引为非法索引。
  4. ArrayStoreException:试图将错误类型的对象存储到一个对象数组时抛出的异常。
  5. ClassCastException:当试图将对象强制转换为不是实例的子类时,抛出该异常。
  6. EnumConstantNotPresentException:当应用程序尝试通过名称访问枚举常量,但枚举类型不包含具有指定名称的常量时,会抛出此异常。
  7. IllegalArgumentException:抛出的异常表明向方法传递了一个不合法或不正确的参数。
  8. IllegalMonitorStateException:抛出的异常表明某一线程已经试图等待对象的监视器,或者试图通知其他正在等待对象的监视器而本身没有指定监视器的线程。
  9. IllegalStateException:在非法或不适当的时间调用方法时产生的信号。换句话说,即 Java 环境或 Java 应用程序没有处于请求操作所要求的适当状态下。
  10. IllegalThreadStateException:线程没有处于请求操作所要求的适当状态时抛出的异常。
  11. IndexOutOfBoundsException:指示某排序索引(例如对数组、字符串或向量的排序)超出范围时抛出。
  12. NegativeArraySizeException:如果应用程序试图创建大小为负的数组,则抛出该异常。
  13. NumberFormatException:当应用程序试图将字符串转换成一种数字类型,但该字符串不能转换时,抛出该异常。
  14. PatternSyntaxException:当正则表达式的语法错误时,抛出该异常。
  15. SecurityException:当存在安全侵犯时,抛出该异常。

异常的处理机制
Java提供了5个关键字来处理异常:try、catch、finally、throw和throws
try:包含可能出现异常的代码块
catch:用于捕获try块中抛出的异常,并处理它
finally:无论try块中的代码是否抛出异常,finally块中的代码都会被执行,它常常用于关闭资源或者进行清理工作
throw:用于显示的抛出一个异常需要是new异常类

throw new ExceptionName("异常信息");

throws:用于声明一个方法可能会抛出异常,但不处理它,也就是往外抛

public class main{
    public static void readChar() throws IOException,RemoteException{
        int input = System.in.read();
    }
}

基本异常处理代码块

public class ExceptionTest1 {
    public static void main(String[] args) {

        try {
            //可能会抛出异常的代码
            int res = 10/0;//这里会抛出ArithmeticException
        }catch (ArithmeticException e){
            //处理这个异常
            System.out.println("除数不能为0" + e.getMessage());
        }finally {
            //无论是否发生异常,都会执行
            System.out.println("finally代码块");
        }
    }

抛出异常
throws子句放在方法参数列表的右括号后面,一个方法可以声明抛出多个异常,多个异常用逗号隔开

public void divide(int dividend,int divisor) throws ArithmeticException{
    if (divisor == 0){
        throw new ArithmeticException("除数不能为0");
    }
    System.out.println(dividend/divisor);
}

当抛出一个被检查的异常,我们必须使用try-catch块来处理它,或者在方法声明中使用throws子句继续往外抛