为什么在Java中,Exception
即使没有抛出异常,我们也可以捕获它,但是却不能捕获它的子类(“ unchecked”
RuntimeException
及其子类除外)。示例代码:
class Test {
public static void main(String[] args) {
try {
// do nothing
} catch (Exception e) {
// OK
}
try {
// do nothing
} catch (IOException e) {
// COMPILER ERROR: Unreachable catch block for IOException.
//This exception is never thrown from the try statement body
}
}
}
有任何想法吗?
任何 代码RuntimeException
都可以引发A。换句话说,编译器无法轻松预测可以抛出哪种代码。阿可通过捕获块。
__RuntimeException``catch(Exception e)
IOException
但是,这是一个检查的异常-
只有声明为抛出该异常的方法调用才可以这样做。编译器可以(合理地)确信除非有声明将其抛出的方法html" target="_blank">调用,否则它不可能发生。
Java编译器根本不考虑“有没有代码在所有try块内”的局面-它总是让你赶上unchecked异常,在所有 合理的 情况下会出现代码, 可以
潜在地抛出一个未经检查的异常。
从JLS的14.21节开始:
如果满足以下两个条件,则可以到达catch块C:
- try块中的某些表达式或throw语句是可到达的,并且可以引发类型可以分配给catch子句C的参数的异常。
- 在try语句中没有较早的catch块A,因此C的参数类型与A的参数类型相同或属于其子类。
可以说,编译器应该意识到在您的第一种情况下,try块中 没有 表达式……对我来说,这似乎仍然是一个无法到达的catch子句。
编辑:如注释中所述,第14.20节包含以下内容:
如果
catch
子句捕获了已检查的异常类型 E1, 但是不存在已检查的异常类型 E2 ,则以下所有条件均成立,这是编译时错误:
- E2 <: E1
try
与该catch
子句对应的块可以抛出 E2- 前面没有
catch
立即封闭try语句块捕获 E2 或的超 E2 。
除非 E1 是Exception类。
因此,这似乎是您 实际上 在犯规的内容,但是对于14.21中无法到达的捕获块而言,此规范并不明确。
我有osgi项目。每个包都是一个单独的maven项目。项目足够大,包括大约10个包。一切正常,一切正常。 在org.apache.maven.plugin.abstractCompilerMojo.execute(abstractCompilerMojo.java:656)在org.apache.maven.plugin.compilerMojo.execute(compilerMojo.java
我有一个接口stores,它有两个方法getName()和getAddres(),我有一个实现stores的类Market,这是我的代码: 和具体类: 我在构造函数中得到关于this.name=name、this.address=address和this.size=size的错误,这些错误表示“无法访问存储”。你知道为什么吗?
问题内容: 我必须使用测试工具编译我的代码,但是,当该测试工具调用我的方法时,我收到此错误: “课程Course中的getCourseDetails方法不能应用于给定类型; 必需:java.lang.String,int,java.lang.String,boolean,java.lang.String.java.lang.String,double 找到:没有参数 原因:实际参数列表和形式参数列
我在vue文件中的“方法”中有这个 我得到以下错误:未捕获(在promise中)TypeError:无法读取未定义的属性'$store'
问题似乎出在代码上。..它指向/usr/lib/jvm/java-1.6.0-openjdk-1.6.0.0.x86_64/jre/../lib/,而它需要查看jar所在的/usr/lib/jvm/java-1.6.0-openjdk-1.6.0.0.x86_64/lib/。谢谢你的回答…
问题内容: 以下代码给出了编译器错误 有时出于测试目的,希望防止某个方法被调用,因此一种快速执行此方法(而不是在使用 该方法的位置处将其注释掉)的方法是立即从该方法返回,以便该方法不执行任何操作。然后,我总是做些什么来解决编译器错误,这是 我很好奇,为什么会出现编译器错误?它会以某种方式破坏Java字节码,是为了保护程序员还是其他? 同样(这对我来说更有趣),如果将Java编译为字节码可以进行任何