是否每个异常都有一个必需的 try-catch?

Does every exception have an required try-catch?

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

很多异常(IndexOutOfBoundException、ArithmeticException、IlligalArgumentException、NullPointerException)都说他们不需要异常,但 FileNotFoundException 需要)...我找不到答案不需要 try-catch。

不,不是每个异常都需要 try-catch。每个已检查的异常都需要一个 try catch。例如,NullPointerException 是一个未经检查的异常,因此它不需要 try-catch,而 FileNotFoundException 是经过检查的,因此它确实需要一个。您还可以将 "throws" 添加到方法签名中,从而避免需要 try-catch。

只有 Checked exception 显式需要捕获它,对于其他所有类型的异常,您可以使用 "throws" 到方法签名。

并非绝对需要为您的例外设置 try/catch 块。相反,您可以 throw 将它们发送给能够正确处理异常的人。

有两种异常:已检查和未检查。 Checked异常可以认为是编译器发现的异常,编译器知道它有机会发生,所以你需要catchthrow 它。例如,打开一个文件。它有可能失败,并且编译器知道这一点,因此您被迫 catchthrow 可能的 IOException.

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

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

另请注意,未经检查的异常(例如:在运行时发生的异常,通常是由于错误的用户输入或诸如此类的原因)通常也会使您的程序崩溃。因此,当可能出现问题时使用 try/catch 通常是个好主意,但 你不必 .

另外值得注意的是,虽然已检查异常是 Exception 的子类,未检查异常是 RuntimeException 的子类,但 RuntimeException 本身是 Exception 的子类。这意味着如果您真的想要,单个 try {} catch (Exception e) {} 将捕获您的程序可能抛出的每一个异常。诚然,这被认为是一种可怕的处理异常的方法,您应该分别捕获每个异常,以便单独处理它们。请尽量不要使用。

阅读: https://docs.oracle.com/javase/tutorial/essential/exceptions/

基本检查异常需要处理或抛出 未经检查的异常和错误可能会被处理或抛出(尽管处理错误通常被认为是不好的做法)。

已检查的异常是从 java.lang.Exception

继承的所有内容

未经检查的异常是从 java.lang.RuntimeException

继承的所有内容

错误是继承自java.lang.Error

的一切

是的,但是如果您不想在您的方法中处理它,您可以使用 throws 关键字将异常传递给方法的调用者。示例:

void execption() throws Exception {
    throw new Exception();
}

void caller() {
    try {
        execption();
    } catch (Exception e) {
        e.printStackTrace();
    }
}

编辑:我对我的 java 有点生疏,就像 josh 说的,你可以有不需要像 NullPointerException 这样的 try/catch 的未经检查的异常,但你可以如果您认为可能会抛出未经检查的异常,请添加一个。示例:

Object obj = null;

obj.hashCode();// if you think a NPE will be thrown you can use a try/catch here

当您显式调用的方法抛出异常时,您必须使用 try....catch 循环。但是如果你给出的列表都是运行时异常。当有时一个程序有非预期的输入或程序被用于某些不适合的用途时,它们就会被抛出。这些不需要 try....catch 循环。