gpt4 book ai didi

java - 为什么编译器不提示这个错误?

转载 作者:搜寻专家 更新时间:2023-11-01 03:14:25 25 4
gpt4 key购买 nike

我正在写一些 Java 问题来帮助我的 friend Java考试。我写了一个问题,我假设代码中会出现三个错误,但编译器只提示了两个。代码是:

class MyClass 
{
static MyClass()
{
System.out.println("I am The First Statement here!");
this();
}
}

我预计会出现以下错误:

  1. 构造函数不能是静态的

  2. this 不能在静态函数中(因为构造函数无效)

  3. this 这里应该是第一个声明。

NetBeans 并没有提示这里的第二个错误。为什么?

最佳答案

当编译器遇到错误时,他们会尝试通过“修复”较早的错误来避免所谓的“次要错误”——由其他错误引起的错误。

例如,由于构造函数声明格式错误,编译器会标记错误。它可以将此解释为构造函数,您已尝试将其设为静态,或者将其解释为缺少已声明返回类型的常规静态方法。编译器可以通过忽略 static 关键字并将其视为常规构造函数来修复您的声明,或者可以将其视为静态方法并“发明”返回类型以弥补缺失的返回类型。

听起来 NetBeans 正在采用第一种方法 - 修复您的构造函数,使其不是静态的。当编译器选择忽略 static 关键字以避免二次错误时,this() 调用就有效了,因为编译器看到它在常规构造函数中,所以不会标记第二个错误。这实际上是可取的行为——编译器作者竭尽全力避免二次错误,因为它们掩盖了“真正的”错误。一旦您自己修复了静态构造函数并删除了 static 关键字,this() 调用就会有效(除非错误 #3。)

总而言之 - 编译器试图向您展示真正的错误,而不是这些错误导致的所有后续问题。

编辑:发生错误后,编译器会尝试通过跳过输入来恢复,以尝试回到正轨(将分词器和解析器重新同步到已知状态)。他们跳过的部分可能包含错误,或者导致编译器随后正确解析的内容出错。因此,错误恢复可能导致一些错误没有被报告。从正确性的角度来看,这并不重要——只要编译器标记一个错误(导致需要错误恢复的原始错误)就足够了。错误处理和错误报告主要是关于可用性的。如果编译器只是在第一个错误处打印“错误”并让您找出错误所在,那么它同样是正确的 - 它只是不太有用。

关于java - 为什么编译器不提示这个错误?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2892698/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com