是否每个异常都有一个必需的 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异常可以认为是编译器发现的异常,编译器知道它有机会发生,所以你需要catch
或throw
它。例如,打开一个文件。它有可能失败,并且编译器知道这一点,因此您被迫 catch
或 throw
可能的 IOException
.
未经检查的异常可以被认为是有可能发生的异常,但根据您的代码,编译器不知道。换句话说,这是一个编程错误。例如,如果您正在接受用户输入并希望输入一个数字,而用户输入了您不希望输入的内容(例如字符串),您的程序将抛出 NumberFormatException
。您可以预测这些情况并输入 try/catch
以在它们发生之前尝试避免它们。很少有人看到有人添加 throws NullPointerException
或 throws 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
循环。
一个简单的问题,我找不到答案。 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异常可以认为是编译器发现的异常,编译器知道它有机会发生,所以你需要catch
或throw
它。例如,打开一个文件。它有可能失败,并且编译器知道这一点,因此您被迫 catch
或 throw
可能的 IOException
.
未经检查的异常可以被认为是有可能发生的异常,但根据您的代码,编译器不知道。换句话说,这是一个编程错误。例如,如果您正在接受用户输入并希望输入一个数字,而用户输入了您不希望输入的内容(例如字符串),您的程序将抛出 NumberFormatException
。您可以预测这些情况并输入 try/catch
以在它们发生之前尝试避免它们。很少有人看到有人添加 throws NullPointerException
或 throws 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
循环。