揭开 Java 中的谜团:“错误:未报告的异常”
遇到神秘的“错误:未报告的异常 ; 必须被抓住或被宣布被抛出”消息?别担心;理解这个编译错误将阐明 Java 概念并指导您解决它。
解析错误消息:
该错误表示您的代码已抛出或传播 已检查异常名为 XXX 且无法处理它
错误背后的概念:
Java 将异常分为两种类型:
-
检查异常:派生自java.lang.Throwable和Exception,排除RuntimeException及其子类,这些异常必须在其封闭方法或构造函数中处理。
-
未检查异常:由 Error 及其子类和 RuntimeException 及其子类组成,未检查异常不需要显式处理。
解决问题:
要解决该错误,您必须通过以下任一方式处理代码中的已检查异常:
-
捕获并处理异常: 包含在 try ... catch 块中触发异常的语句,如代码示例中所示下面:
try {
// Code that may throw the checked exception
if (someFlag) {
throw new IOException("cannot read something");
}
// Subsequent code
} catch (IOException ex) {
// Handle the exception gracefully
}
-
声明封闭的方法或构造函数抛出异常:通过在方法或构造函数声明中添加 throws XXX 子句,您可以委托处理方法或构造函数的调用者的异常的责任。下面是一个示例:
public void doThings() throws IOException {
// Code that may throw an IOException
if (someFlag) {
throw new IOException("cannot read something");
}
// Subsequent code
}
做出正确的选择:
正确的方法取决于上下文以及您对异常的期望处理代码。在处理时考虑严重性级别和从异常中恢复的能力。
特殊注意事项:
-
静态初始化程序: 由于语法限制,在静态初始化器中处理检查异常需要小心处理。考虑使用静态块来代替。
-
静态块:检查的异常必须在静态块中捕获,因为没有封闭的上下文。
-
Lambdas:由于 Lambda 使用的函数接口,因此无法引发未经检查的异常。处理 lambda 本身内的异常。
-
多个异常: 如果尽管名称相同,但异常的完全限定名称不同,则这些异常是不同的。单独处理它们。
其他资源:
-
Oracle Java 教程:
- [catch 或指定要求](https://docs.oracle.com/javase/tutorial/essential/exceptions/catchexceptions.html#:~:text=catch 或指定要求)
- [捕捉和处理异常](https://docs.oracle.com/javase/tutorial/essential/exceptions/handling.html)
- [指定方法抛出的异常](https://docs.oracle.com /javase/tutorial/essential/exceptions/ throwing.html)
以上是为什么我在 Java 中收到'错误:未报告的异常;必须捕获或声明为抛出”?的详细内容。更多信息请关注PHP中文网其他相关文章!