Java异常处理面试题及答案(1-5)

1、Java中的异常体系结构是什么样子的?
Java中的异常体系结构是一个树形结构,根是Throwable类,它有两个子类:Error和Exception。Error表示虚拟机本身的错误,程序无法处理。Exception又分为检查性异常和非检查性异常,检查性异常必须由程序员在代码中处理,否则编译不通过,非检查性异常则可以不处理,由虚拟机自动处理。

2、finally块中的代码什么时候会执行?
finally块中的代码会在try块中的代码执行完毕后,无论是否发生异常,都会执行。

3、如何自定义异常类?
自定义异常类只需要继承Exception或其子类即可。一般来说,自定义异常类应该包含两个构造方法:一个无参构造方法,一个带有异常信息的构造方法,以便在抛出异常时能够提供有用的信息。

例如:

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

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

4、什么是异常链?
异常链指的是一个异常对象包含另一个异常对象的情况。这种情况通常发生在一个异常抛出后又抛出了另一个异常。在这种情况下,如果只抛出新的异常,那么之前的异常信息就会丢失。为了避免这种情况,Java提供了异常链的机制,即将之前的异常对象作为新异常对象的cause。

例如:

try {
    // some code that may throw an exception
} catch (Exception e) {
    throw new MyException("Something went wrong", e);
}

5、什么是异常处理的“最佳实践”?
在Java异常处理中,有一些“最佳实践”可以遵循,包括:

  • 尽可能早地捕获异常,这样可以避免程序在后面的运行中因为未处理的异常而崩溃。
  • 只捕获需要处理的异常,不要捕获所有异常。只捕获需要处理的异常可以使代码更加简洁,同时也能让开发者更好地理解代码。
  • 在处理异常时,尽可能提供有用的异常信息,包括异常类型、异常原因等等。这样可以让开发者更容易地理解和修复问题。
  • 在处理异常时,尽可能避免捕获Throwable类,这样可以避免捕获一些无法处理的异常。