目录

  • 异常
  • 1. 异常的分类
  • a. Error(错误)
  • b. Exception(异常)
  • c. Error 与 Exception 的结构
  • 2. RuntimeException(运行时异常)
  • a. NullPointerException(空指针异常)
  • b. ArithmeticException(数学运算异常)
  • c. IndexOutOfBoundsException(索引越界)
  • i. ArrayIndexOutOfBoundsException(数组索引越界)
  • d. NegativeArraySizeException(数组大小为负值异常)
  • e. IllegalArgumentException(非法参数异常)
  • i. NumberFormatException(数字格式异常)
  • f. NoSuchElementException(无此类元素异常)
  • i. InputMismatchException(输入类型不匹配异常)
  • g. ClassCastException(类型间转换不兼容)
  • h. UnsupportedOperationException(类不支持的操作异常)
  • 3. CheckedException(编译异常)
  • a. ReflectiveOperationException(反射操作异常)
  • i. NoSuchMethodException(引用方法错误)
  • ii. IllegalAccessException(类非法访问异常)
  • iii. InstantiationException(类实例化异常)
  • iv. ClassNotFoundException(类未找到异常)
  • v. InvocationTargetException(类调用目标异常)
  • b. unreachable statement(无法到达)
  • c. InterruptedException(类中断异常)
  • d. IOException(流传输异常)
  • i. InvalidClassException(类无效类例外)
  • 4. Error
  • a. StackOverFlowError(栈内存溢出错误)



异常

  • 异常也被称为例外,是程序运行过程中发生的会打断程序正常执行的事件,会导致 JVM 的非正常停止;
  • 设计程序必须考虑到可能发生的异常事件,并做出相应的处理;
  • Java 中所有的异常都以类的类型存在,除了内置的异常类之外,Java 也可以定义异常类,Java 的异常机制也允许自定义抛出异常;

1. 异常的分类

  • java.lang.Throwable 类是 Java 中所有错误或异常类的根类,两个重要子类是 Error 类和 Exception 类;

a. Error(错误)

  • java.lang.Error 类是程序无法处理的错误,表示应用程序运行时出现的重大错误,是系统崩溃类型的,所以一般很少碰到;
  • Error 类错误都交由系统来处理;
  • 常见 Error 类例子:JVM 运行时出现的 OutOfMemoryError,Socket 编程时出现的端口占用,代码少了一个分号等语法错误导致的 Compile Error;

b. Exception(异常)

  • java.lang.Exception 类是程序本身可以处理的异常,相对于 Error,一般只是处理 Exception,Exception 可分为运行时异常和编译异常(也叫编译错误);
  • 运行时异常指 RunTimeException 及其子类的异常,也称作 UncheckedException,这类异常在代码编写的时候不会被编译器检测出来,可以不捕捉,但是一般要根据需要捕捉这些异常,常见的运行时异常有 NullPointerException(空指针异常),ClassCastException(类型转换异常),IndexOutOfBoundsException(数组越界异常)等;
  • 编译异常指除了 RunTimeException 以外的异常,称作 CheckedException,在编译时编译器会提示这类异常需要捕捉,如果不进行捕捉就会出现编译错误,常见的编译异常有 IOException(流传输异常),SQLException(数据库操作异常)等;

c. Error 与 Exception 的结构

java异常两大基础类的区别 java中异常的分类及其概念_error


2. RuntimeException(运行时异常)

a. NullPointerException(空指针异常)

  • 例如:在要求使用对象的地方使用了 null;
  • 例如:使用映射不允许使用的 null 对象;
  • 例如:数组被赋值 null 后不再保存内存地址,需要给数组一个真正的堆内存空间:
public class Test {
    public static void main(String[] args) {
        int[] arr = new int[3];
        arr = null;
        System.out.println(arr);//输出null(输出数组先判断有无地址,有地址无赋值就输出字符串,此时的null是输出无地址的null)
        System.out.println(arr[0]);//NullPointerException
    }
}

b. ArithmeticException(数学运算异常)

  • 例如:程序出现了除数为0的运算;

c. IndexOutOfBoundsException(索引越界)

i. ArrayIndexOutOfBoundsException(数组索引越界)

  • 例如:数组长度为3,索引范围是0~2,但是我们却访问了一个3的索引;
public class Test {
    public static void main(String[] args) {
        int[] arr = new int[3];
        System.out.println(arr[3]);
    }
}

d. NegativeArraySizeException(数组大小为负值异常)

  • 例如:使用负的数组大小值创建数组;
  • 例如:创建一个长度为参数 length 的 StringBuffer 类的对象时,如果参数 length 小于 0,将触发 NegativeArraySizeException 异常;

e. IllegalArgumentException(非法参数异常)

i. NumberFormatException(数字格式异常)

  • 例如:字符串参数的内容无法正确转换为对应的基本类型,调用需要转换的基本数据类型对应包装类的 parseXXX(String s),其中 XXX 表示基本类型,参数为可以转成基本类型的字符串,必须保证 s 可以转换为基本数据类型,不能包含空格,否则将会发生数字转换的问题;

f. NoSuchElementException(无此类元素异常)

  • 例如:调用的映射中没有元素存在;

i. InputMismatchException(输入类型不匹配异常)

  • 由 Scanner 类抛出,指读取的数据类型与期望获得的类型不同;

g. ClassCastException(类型间转换不兼容)

  • 例如:将对象强制转换为与该继承对象实例没有任何继承关系的类时;
  • 例如:对象与映射中的元素不兼容;

h. UnsupportedOperationException(类不支持的操作异常)

  • 例如:改变一个不允许修改的映射;

3. CheckedException(编译异常)

a. ReflectiveOperationException(反射操作异常)

i. NoSuchMethodException(引用方法错误)

  • 例如:对 println 的引用不明确;
System.out.println(null);
  • 例如:main() 方法没有加 public;

ii. IllegalAccessException(类非法访问异常)

  • 例如:用反射机制来创建对象时,该类构造方法是不可访问的;

iii. InstantiationException(类实例化异常)

  • 例如:用反射机制来创建对象时,该类没有相应的构造方法,导致实例化失败;

iv. ClassNotFoundException(类未找到异常)

  • 例如:JVM 在反序列化对象时找不到该类的 class 文件;

v. InvocationTargetException(类调用目标异常)

  • InvocationTargetException 异常由 Method.invoke(obj, args...) 方法抛出。当被调用的方法的内部抛出了异常而没有被捕获时,将由此异常接收。

b. unreachable statement(无法到达)

  • 例如:死循环后的不可到达;
public class Test {
    public static void main(String[] args) {
        while (true) {//true不能省略,死循环推荐格式
        }
        System.out.println("here");
    }
}
public class test {
    public static void main(String[] args) {
        for (; ; ) {
        }
        System.out.println("here");
    }
}

c. InterruptedException(类中断异常)

  • 当线程等待、睡眠或以其他方式占用时引发,并且线程在活动之前或期间中断;

d. IOException(流传输异常)

  • 常见于输入输出;
  • 例如:关闭输入流后再操作,会抛出 IOException;

i. InvalidClassException(类无效类例外)

  • 例如:当 JVM 反序列化对象时,能找到 class 文件,但是 class 文件在序列化对象之后发生了修改,此时反序列化操作也会失败,抛出 InvalidClassException;

4. Error

a. StackOverFlowError(栈内存溢出错误)

  • 例如:迭代方法使用过多方法,是最常见的一种 StackOverFlowError;