Java 异常主要分为三类:
1. 检查异常(Checked Exception):在程序中必须显式处理,否则编译器将不允许代码通过编译。例如:
IOException
及其子类:处理输入输出相关的异常,如文件读写错误、管道通信错误等。SQLException
:数据库访问时可能发生的异常。ClassNotFoundException
:类找不到异常,当试图通过字符串形式的类名加载类,但是找不到对应的类定义时抛出。FileNotFoundException
:当试图打开一个不存在的文件时抛出。InterruptedException
:线程等待时被中断的异常。URISyntaxException
:处理URI字符串格式错误时抛出。ClassNotFoundException
:尝试加载类时找不到对应的类定义。NoSuchFieldException
、NoSuchMethodException
:分别表示在反射操作中找不到指定的字段或方法时抛出。CloneNotSupportedException
:当试图克隆一个没有实现Cloneable
接口的对象时抛出。InstantiationException
:当试图实例化一个抽象类或者接口时抛出。IllegalAccessException
:当试图访问一个不允许访问的成员时抛出。IllegalArgumentException
:传递给方法的参数不合法时抛出,尽管它是一个运行时异常,但在某些上下文中可能作为检查型异常对待。
这些只是众多检查型异常中的一小部分,实际上Java标准库中包含大量的检查型异常类,用于描述各种可能的错误情况。开发人员在编写代码时,应当根据具体的操作和上下文选择合适的异常类型进行处理或声明。
2. 运行时异常(Runtime Exception):在程序中可以不进行显示处理的异常。例如:
NullPointerException
:当试图访问或操作一个为null
的对象引用时抛出。ClassCastException
:尝试将对象强制转换为不是该对象实际类型的类或接口时抛出。IndexOutOfBoundsException
及其子类:ArrayIndexOutOfBoundsException
:当对数组的索引超出其界限时抛出。StringIndexOutOfBoundsException
:当对字符串的索引超出其界限时抛出。
ArithmeticException
:数学运算异常,比如除以零时抛出。IllegalArgumentException
:传递给方法的参数不合法时抛出。NumberFormatException
:将一个字符串转换为数字类型时,该字符串不符合数字格式要求时抛出。UnsupportedOperationException
:当调用不支持的操作时抛出。IllegalStateException
:当对象处于不适当的状态时调用方法,即方法调用时机不合适时抛出。ConcurrentModificationException
:当迭代过程中集合被非法修改时抛出。NullPointerException
:访问或操作null
对象时触发。ArrayStoreException
:试图将不兼容类型的对象存入数组时抛出。BufferOverflowException
和BufferUnderflowException
:在进行IO操作时,缓冲区溢出或下溢时抛出。NoSuchElementException
:指示没有更多的元素,但是却被请求下一个元素时抛出。InputMismatchException
:输入的数据与预期类型不匹配时抛出,常见于Scanner
类的使用中。
这些运行时异常通常反映了程序逻辑的缺陷或不恰当的使用,开发者应当尽可能地避免这些情况的发生,通过代码审查和测试来提高程序的健壮性。
3. 错误(Error):表示系统级别的错误,程序无法处理,一旦出现此类错误,程序将立即停止运行。例如:
-
Error
:所有错误的基类,它本身是一个抽象类。 -
VirtualMachineError
:表示Java虚拟机发生了内部错误,如内存不足时的OutOfMemoryError
、请求栈深度过大时的StackOverflowError
、以及一般性的虚拟机错误InternalError
。 -
ThreadDeath
:线程终止的一种特殊形式,虽然它是一个 "error",但在实践中通常像异常一样被捕获和处理。 -
LinkageError
:发生在链接过程中的错误,比如类之间版本不兼容导致的VerifyError
、类找不到所需的native库时的UnsatisfiedLinkError
。 -
ExceptionInInitializerError
:当静态初始化器(static initializer)抛出异常时,这个错误会被抛出。 -
NoClassDefFoundError
:当Java虚拟机或类加载器在定义类时找不到相应的类定义时抛出。 -
ClassNotFoundException
:严格意义上讲,这是一个异常,但它经常与上述错误一起讨论,因为它也是类加载失败的一种表现,不过是在通过Class.forName
等方式动态加载类时发生的。
总的来说,错误(Error)是Java异常体系中表示较为严重且通常不可恢复情况的一个分支,它们通常指示了JVM自身的问题或应用程序运行环境的重大故障。开发者在编写代码时,应关注于处理可恢复的异常(Exception),而对于错误,更多地是依赖于日志记录和系统级的监控来进行问题排查和恢复。
需要注意的是, Error 与 Exception 不同。 Error 表示系统级别的错误或资源耗尽问题,对于这类错误,程序无法处理,只能选择终止程序的运行。而 Exception 表示由程序员编写的代码出现的异常情况,可以通过代码进行处理。 RuntimeException 是 Exception 的子类,是一种特殊类型的异常,也被称为“非检查异常”,这类异常可以不显式处理,但是建议在代码中进行处理以提高程序的健壮性和可读性。