2012-11-01 167 views
9

我正處於編碼的中間,並無意中將下面的代碼行放在聲明實例變量的類的一部分。但我檢查了它,並且在任何地方給出了相同的錯誤,我的意思是:在靜態塊內部,在構造函數內部,在任何類方法內部。除非private;作爲該課程的第一行 Syntax error, insert "EnumBody" to complete ClassBodyDeclarations(由@chaitanya10在下面的註釋中所寫,並且在我的工作空間中由我進行驗證),當我們將光標懸停在eclipse工具提示上時出現錯誤。語法錯誤,插入「EnumBody」來完成EnumDeclaration

我知道有錯誤。
但我不明白當我將光標懸停在錯誤上的錯誤消息。這條消息的含義是什麼?

它爲什麼期待EnumBody

下面是截圖。

enter image description here

+2

@Aubin,我不認爲-1是合法的。我只是對錯誤消息感到好奇,因爲我不小心把上面的語句,看到了錯誤信息。 –

+0

@Aubin,如果您更詳細地證明downvote的理由,我將不勝感激。 –

+0

是來自Enum的這段代碼? – PermGenError

回答

8

對於一個真正的解釋,有人需要做的語法檢查的詳細分析和語法錯誤恢復和Eclipse Java編譯器前端的報表組件。但最可能的解釋是,你的「異常」語法錯誤已經「混淆了」編譯器的語法錯誤恢復代碼。

總之,它是一個小編譯器錯誤(或功能)。

很可能是開發者知道這一點,但是從固定它都忍住了,因爲:

  • 它不經常發生,
  • 它可能很難做得更好...在不破壞其他錯誤恢復情況下,和/或
  • 任何變化中斷一些編譯器錯誤迴歸測試。
4

對於它的價值,如下:

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時引入的一個錯誤,它的處理方式與某些其他令牌的處理方式稍有不同,導致它以不同的方式恢復,因此出現在編譯器錯誤。

+0

+1我真的很感謝你的努力和你真棒的研究工作。 –

+0

+1一個不太明確的問題的詳細分析。 –

1

即使我的代碼是正確的,這也發生在Eclipse中。發生是因爲我寫了一些代碼而沒有首先添加jar(aspectJ JARs),並且在我添加JAR之後出現了這個問題。

起初我複製了代碼,刪除了它,然後粘貼回去,認爲這是紅線消失,但在運行時拋出錯誤。然而,我確實通過刪除類,重新創建它,然後再次輸入相同的確切代碼並使其工作。複製粘貼可能會在刪除課程後起作用,但是我確實輸入了它。

絕對是一個奇怪的問題。我知道代碼是正確的,因爲我是從一本書中複製出來的(Spring in action 4th edition - 一個很好的閱讀順便說一句)。無論如何,希望這可以幫助你或未來的人!讓我瘋狂了大約一個小時

相關問題