是否每个异常都有所需的尝试捕获?

2022-09-02 11:20:04

一个简单的问题,我找不到答案。Java中的每个异常都需要使用 try-catch 吗?还是仅适用于FileNotFoundException?

很多例外(IndexOutOfBoundException,ArithmeticException,IlligalArgumentException,NullPointerException)都说他们不需要异常,但FileNotFoundException需要)...我找不到答案,哪些不需要尝试捕获。


答案 1

对于您的例外,并不是绝对需要有一个块。相反,您可以将它们发送给能够正确处理异常的人。try/catchthrow

有 2 种例外情况:已选中和未选中。Checked 异常可以被视为由编译器找到的异常,并且编译器知道它有机会发生,因此您需要或它。例如,打开一个文件。它有可能失败,编译器知道这一点,所以你被迫或可能的.catchthrowcatchthrowIOException

“未选中”异常可以被视为有可能发生的异常,但根据您的代码,编译器不知道。换句话说,这是一个编程错误。例如,如果您正在接受用户输入并期望一个数字,并且用户输入了您意想不到的内容(如字符串),则程序将抛出一个 .您可以预测这些情况,并在它们发生之前尝试避免它们。很少看到一个人添加或(或抛出任何其他未检查的异常,就此而言)。这是允许的,但明确创建该异常很奇怪,大多数人会说这是糟糕的编码风格。NumberFormatExceptiontry/catchthrows NullPointerExceptionthrows NumberFormatException

请注意,所有已检查的建议都必须被捕获或扔到可以处理它的东西上;如果你不这样做,你的程序将无法编译。如果你把它扔到无法处理它的东西上,那么如果它发生,你的程序可能会崩溃。

另请注意,未经检查的异常(例如:在运行时发生的异常,通常是通过错误的用户输入或其他方式)通常也会使您的程序崩溃。因此,当某些事情可能出错时使用通常是一个好主意,但您不必这样做try/catch

同样有趣的是,虽然已检查的异常是 Exception 的子类,而 Unchecked 异常是 RuntimeException 的子类,但 RuntimeException 本身就是 Exception 的子类。这意味着,如果你真的想这样做,一个单一的将捕获你的程序可能引发的每一个异常。当然,这被认为是处理异常的可怕方法,您应该单独捕获每个异常,以便您可以单独处理它们。请尽量不要使用它。try {} catch (Exception e) {}


答案 2

不,并非每个异常都需要尝试捕获。每个已检查的异常都需要一个 try catch。例如,NullPointerException 是一个未选中的异常,因此它不需要 try-catch,而 FileNotFoundException 是选中的,因此它确实需要一个。您还可以将“throws”添加到方法签名中,从而避免需要 try-catch。