java 异常

146 阅读4分钟

Throwable

Throwable 是 Java 语言中所有错误(Error)和异常(Exception)的超类

主要方法:

  • fillInStackTrace - 用当前的调用栈层次填充 Throwable 对象栈层次,添加到栈层次任何先前信息中。
  • getMessage - 返回关于发生的异常的详细信息。这个消息在 Throwable 类的构造函数中初始化了。
  • getCause - 返回一个 Throwable 对象代表异常原因。
  • getStackTrace - 返回一个包含堆栈层次的数组。下标为 0 的元素代表栈顶,最后一个元素代表方法调用堆栈的栈底。
  • printStackTrace - 打印 toString() 结果和栈层次到 System.err,即错误输出流。
  • toString - 使用 getMessage 的结果返回代表 Throwable 对象的字符串。

Error

Error 表示正常情况下,不大可能出现的严重问题
编译器不会检查 Error

常见 Error

  • AssertionError - 断言错误。
  • VirtualMachineError - 虚拟机错误。
  • UnsupportedClassVersionError - Java 类版本错误。
  • StackOverflowError - 栈溢出错误。
  • OutOfMemoryError - 内存溢出错误

#Exception

  • ClassNotFoundException - 应用程序试图加载类时,找不到相应的类,抛出该异常。
  • CloneNotSupportedException - 当调用 Object 类中的 clone 方法克隆对象,但该对象的类无法实现 Cloneable 接口时,抛出该异常。
  • IllegalAccessException - 拒绝访问一个类的时候,抛出该异常。
  • InstantiationException - 当试图使用 Class 类中的 newInstance 方法创建一个类的实例,而指定的类对象因为是一个接口或是一个抽象类而无法实例化时,抛出该异常。
  • InterruptedException - 一个线程被另一个线程中断,抛出该异常。
  • NoSuchFieldException - 请求的变量不存在。
  • NoSuchMethodException - 请求的方法不存在。

RuntimeException

RuntimeException 是那些可能在 Java 虚拟机正常运行期间抛出的异常的超类。

编译器不会检查 RuntimeException 异常。
当程序中可能出现这类异常时,倘若既没有通过 throws 声明抛出它,也没有用 try catch 语句捕获它,程序还是会编译通过。

-   `ArrayIndexOutOfBoundsException` - 用非法索引访问数组时抛出的异常。如果索引为负或大于等于数组大小,则该索引为非法索引。
-   `ArrayStoreException` - 试图将错误类型的对象存储到一个对象数组时抛出的异常。
-   `ClassCastException` - 当试图将对象强制转换为不是实例的子类时,抛出该异常。
-   `IllegalArgumentException` - 抛出的异常表明向方法传递了一个不合法或不正确的参数。
-   `IllegalMonitorStateException` - 抛出的异常表明某一线程已经试图等待对象的监视器,或者试图通知其他正在等待对象的监视器而本身没有指定监视器的线程。
-   `IllegalStateException` - 在非法或不适当的时间调用方法时产生的信号。换句话说,即 Java 环境或 Java 应用程序没有处于请求操作所要求的适当状态下。
-   `IllegalThreadStateException` - 线程没有处于请求操作所要求的适当状态时抛出的异常。
-   `IndexOutOfBoundsException` - 指示某排序索引(例如对数组、字符串或向量的排序)超出范围时抛出。
-   `NegativeArraySizeException` - 如果应用程序试图创建大小为负的数组,则抛出该异常。
-   `NullPointerException` - 当应用程序试图在需要对象的地方使用 null 时,抛出该异常
-   `NumberFormatException` - 当应用程序试图将字符串转换成一种数值类型,但该字符串不能转换为适当格式时,抛出该异常。
-   `SecurityException` - 由安全管理器抛出的异常,指示存在安全侵犯。
-   `StringIndexOutOfBoundsException` - 此异常由 String 方法抛出,指示索引或者为负,或者超出字符串的大小。
-   `UnsupportedOperationException` - 当不支持请求的操作时,抛出该异常。

自定义

public class MyException extends RuntimeException {

    public MyException(String message) {
        super(message);
    }

    public static void main(String[] args) {
        throw new MyException("异常");
    }

}

throw 和 throws 的区别:

  • throws 使用在函数上,throw 使用在函数内。
  • throws 后面跟异常类,可以跟多个,用逗号区别;throw 后面跟的是异常对象

异常链

juejin.im/post/5b6d61…

注意事项

Java 异常处理中 finally 中的 return 会覆盖 catch 代码块中的 return 语句和 throw 语句,所以 Java 不建议在 finally 中使用 return 语句

当子类重写父类带有 throws 声明的函数时,其 throws 声明的异常必须在父类异常的可控范围内——用于处理父类的 throws 方法的异常处理器,必须也适用于子类的这个带 throws 方法 。这