Java未选中的异常不能使用try/catch块来处理吗?

2022-09-01 15:13:30

在一个教程中,我发现你的代码无法处理未检查的异常,即我们不能使用块,并且示例是异常,例如但是这些异常可以使用try/catch块来处理。我想我不清楚这个概念!try/catchArrayIndexOutOfBoundsException, NullPointerException.

另外,我认为投掷关键字只能与块一起使用,可以投掷关键字与一起使用吗?try/catchUncheckedException


答案 1

已选中和未选中的异常之间的唯一区别是,必须使用 捕获或声明已检查的异常,而对于未选中的异常,这是可选的。throws

未选中的异常无法由您的代码处理,即我们不能使用 try/catch 块

当然可以 - 但我们不必这样做。

另外,我认为投掷关键字只能与try/catch块一起使用.throw关键字可以与未检查的异常一起使用吗?

请注意,有个关键字:

  • throw显式引发您创建的异常对象。 工作得很好,尽管明确创建该特定异常并不常见,大多数人会认为这是糟糕的风格。throw new NullPointerException();
  • throws声明方法可能引发该异常。对于未经检查的例外,这是可选的,但对于记录事实很有用(同样,通常不会声明,因为这几乎是给定的)。throws NullPointerException

答案 2

所有未选中的异常都可以以与选中的异常相同的方式处理 - 如果需要,您可以通过声明方法它们来让它们通过:throws

public void m() throws RuntimeException {}

或者你可以他们:catch

public void m() {
    try {
        // some code
    } catch (RuntimeException re) {
        // do something
    }
}

应该注意的是,该类充当未检查异常的捕获全部(因为所有未检查的异常都从它扩展),就像类是已检查异常的捕获一样。RuntimeExceptionException

如前所述,唯一真正的区别是,对于已检查的异常,您必须处理它们(通过让它们传递或捕获它们),编译器将确保这一点 - 另一方面,处理未检查的异常是可选的。

这一切都归结为每种异常类型的预期用法 - 您应该能够从检查的异常中恢复(或者至少在它们发生时对它们做些什么),而对于未经检查的异常,可能没有合理的方法来从中恢复。当然,这有点主观。


推荐