当前位置: 首页 > 面试题库 >

Java无法访问的catch块编译器错误

耿招
2023-03-14
问题内容

为什么在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编译为字节码可以进行任何