9

我正在编码中,不小心将以下代码行放在我们声明实例变量的类部分。但是我检查了一下,它在任何地方都给出了相同的错误:在静态块内,在构造函数内,在任何类方法内。当我们将光标悬停在 Eclipse 工具提示上时,除非private;将其作为它给出的类的第一行 (正如@chaitanya10 在下面的评论中所写,并由我在我的工作区中验证)错误。Syntax error, insert "EnumBody" to complete ClassBodyDeclarations

我明白有错误。
但是当我将光标悬停在错误上时,我不明白错误消息。这条消息的含义是什么?

为什么期待EnumBody

下面是截图。

在此处输入图像描述

4

3 回答 3

11

要真正解释清楚,需要有人对 Eclipse Java 编译器前端的语法检查、语法错误恢复和报告组件进行详细分析。但最可能的解释是,您的“不寻常”语法错误“混淆”了编译器的语法错误恢复代码。

简而言之,它是一个小的编译器错误(或功能)。

开发人员可能知道这一点,但由于以下一项或多项原因而没有修复它:

  • 它不会经常发生,不足以被优先考虑。
  • 在不影响其他错误恢复案例的情况下,可能很难做得更好。
  • 任何更改都可能破坏1一些编译器错误回归测试。
  • 还有其他更高优先级的问题需要处理。

1 - Break ... 在某种意义上导致测试失败是因为测试中的假设而不是被测试代码中的问题。修复这些回归可能很麻烦。

于 2012-11-08T11:26:42.743 回答
5

对于它的价值,以下内容:

public class Foo;

错误:Syntax error, insert "ClassBody" to complete ClassBodyDeclarations

public enum Foo;

错误:Syntax error, insert "EnumBody" to complete ClassBodyDeclarations

public interface Foo;

错误Syntax error, insert "InterfaceBody" to complete ClassBodyDeclarations

无论如何,我认为会发生什么,在 this org.eclipse.jdt.internal.compiler.parser.Parser.consumeEnumConstantHeader()中,当它使用此代码出现解析错误时,它会尝试恢复:

if(this.currentToken == TokenNameSEMICOLON) {
    RecoveredType currentType = currentRecoveryType();
    if(currentType != null) {
        currentType.insideEnumConstantPart = false;
    }
}

所以它正确地判断出我们不在一个枚举中,所以我们得到一个像上面这样的错误,但它没有意识到我们甚至不知道它是否是一个枚举。你可以在这里查看源代码:

换句话说,这可能是 Eclipse 团队在添加 Enumerations 时引入的一个错误,它的处理方式与其他一些标记略有不同,这导致它以不同的方式被恢复,因此出现在编译器错误中。

于 2012-11-09T05:27:42.300 回答
1

即使我的代码是正确的,这也发生在 Eclipse 中。发生是因为我在没有先添加 jar 的情况下编写了一些代码(aspectJ JARs),并且在我添加了 JAR 之后出现了这个问题。

起初,我复制了代码,删除了它,然后将其粘贴回去,并认为随着红线消失但运行时抛出了错误。但是,我确实通过删除该类,重新创建它并再次输入相同的确切代码来使其工作,并且它可以工作。删除课程后复制粘贴可能会起作用,但我确定了它。

绝对是个奇怪的问题。我知道代码是正确的,因为我是从一本书中复制出来的(Spring in action 第 4 版——顺便说一句很好读)。无论如何,希望这对您或将来的某人有所帮助!把我逼疯了大约一个小时

于 2017-07-08T08:21:48.090 回答