【问题标题】:Syntax error , insert "EnumBody" to complete EnumDeclaration语法错误,插入“EnumBody”完成EnumDeclaration
【发布时间】:2012-10-21 19:17:45
【问题描述】:

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

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

为什么它期待 EnumBody

下面是截图。

【问题讨论】:

  • 这段代码是来自枚举吗??
  • @chaitanya10 不,此屏幕截图来自类的实例变量声明部分。但如果我把它放在某个函数或任何其他地方,它也是一样的错误。
  • 我认为是因为你在末尾放了一个分号,编译器认为它是行尾,这显然是一个语法错误,因为你从未在声明中给出类型和变量名
  • @chaitanya10 ,我明白了。有错误。我不明白的是错误信息。为什么期待EnumBody 完成EnumDeclaration
  • 我将把它放在评论而不是答案中,因为我不知道它是否正确:我的猜测是 Eclipse 正在使用 LR 解析器来解析 Java 源代码。这意味着它正在尝试确定可以在该点匹配的产品的最右侧符号。它可以模糊匹配的东西是方法定义、字段等,以及像枚举这样的类型定义。在可以匹配的事物列表中,枚举定义可能在语法中首先列出。因此,Eclipse 认为它缺少枚举声明的最后一个符号,即 EnumBody。

标签: java eclipse syntax-error eclipse-indigo


【解决方案1】:

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

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

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

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

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

【讨论】:

    【解决方案2】:

    为了它的价值,以下是:

    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

    无论如何,我认为发生的情况是,在这个 org.eclipse.jdt.internal.compiler.parser.Parser.consumeEnumConstantHeader() 中,它会在收到此代码的解析错误时尝试恢复:

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

    所以它正确地判断出我们不在一个枚举中,所以我们得到一个像上面这样的错误,但它没有意识到我们甚至不知道它是否是一个枚举。 You can look at the source here:

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

    【讨论】:

    • +1 我非常感谢您的努力和您出色的研究工作。
    【解决方案3】:

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

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

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

    【讨论】:

    • “我知道代码是正确的,因为我是从书中复制出来的……” - 不一定。 1)书籍可能是错误的。即使是好的。 2) 一本书的机器可读版本的文本可能包含奇数字符。诸如倾斜的引号字符、长破折号、不间断空格等可能看起来写在纸上但会让编译器消化不良的东西。
    • 无论哪种方式,问题都是关于真正错误的不正确错误消息,而不是关于不是......或可能不是......真正错误的错误。除非您可以真正重现问题并告诉我们如何做到这一点,否则无法说出您遇到了什么。 (当然。你做了什么“为你修复了它”。但我们不知道它修复了什么,或者为什么。)
    猜你喜欢
    • 2017-07-30
    • 1970-01-01
    • 2012-04-16
    • 1970-01-01
    • 1970-01-01
    • 2011-10-14
    • 1970-01-01
    • 2012-01-27
    • 1970-01-01
    相关资源
    最近更新 更多