MST
星途 面试题库

面试题:Java中Java虚拟机异常处理机制之自定义异常

如何自定义一个运行时异常(RuntimeException)和一个受检异常(Checked Exception)?在自定义异常类中通常需要做哪些事情?在Java虚拟机层面,这两种异常的处理有何不同?
28.1万 热度难度
编程语言Java

知识考点

AI 面试

面试题答案

一键面试

自定义运行时异常(RuntimeException)

在Java中,自定义运行时异常需要继承自RuntimeException类或它的子类。示例代码如下:

public class CustomRuntimeException extends RuntimeException {
    public CustomRuntimeException() {
        super();
    }

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

    public CustomRuntimeException(String message, Throwable cause) {
        super(message, cause);
    }

    public CustomRuntimeException(Throwable cause) {
        super(cause);
    }
}

自定义受检异常(Checked Exception)

自定义受检异常需要继承自Exception类,但不能继承自RuntimeException类或它的子类。示例代码如下:

public class CustomCheckedException extends Exception {
    public CustomCheckedException() {
        super();
    }

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

    public CustomCheckedException(String message, Throwable cause) {
        super(message, cause);
    }

    public CustomCheckedException(Throwable cause) {
        super(cause);
    }
}

在自定义异常类中通常要做的事情

  1. 提供构造函数:通常提供无参构造函数、带字符串消息的构造函数,以及同时带字符串消息和原因(Throwable)的构造函数。这样可以方便在不同场景下抛出异常,并且能够携带更多有用的信息。
  2. 传递异常信息:通过调用父类的构造函数,将异常信息和原因传递给父类,以便在异常处理时可以获取这些信息。

Java虚拟机层面两种异常处理的不同

  1. 运行时异常(RuntimeException)
    • 无需显式声明:方法调用链上的方法不需要在throws子句中声明可能抛出的运行时异常。这使得代码在处理一些预期可能发生但不需要强制处理的错误时更加简洁,比如空指针异常(NullPointerException)。
    • 运行时检查:Java虚拟机在运行时遇到运行时异常时,会沿着调用栈向上查找合适的异常处理器。如果一直找不到,那么Java虚拟机就会终止当前线程,并打印异常堆栈跟踪信息。
  2. 受检异常(Checked Exception)
    • 强制声明:方法必须在throws子句中声明可能抛出的受检异常,除非该方法已经处理了这些异常。这就要求调用者必须显式处理这些异常,要么使用try-catch块捕获,要么继续在自己的throws子句中声明。
    • 编译时检查:Java编译器在编译时会检查方法是否正确声明或处理了可能抛出的受检异常。如果方法没有正确处理,编译器会报错,阻止代码编译通过。这有助于在开发阶段发现潜在的异常情况,提高代码的健壮性。