问题
I was in middle of coding and accidentally put the following line of code at the part of class where we declare instance variables. but i checked and it gives the same error anywhere by anywhere i mean : inside a static block, inside constructor, inside any class method. except when private;
is put as the first line of the class it gives
Syntax error, insert "EnumBody" to complete ClassBodyDeclarations
(as written by @chaitanya10 in comments below and also verified by me on my workspace) error in eclipse tooltip when we hover cursor over it.
I understand there is error.
but I dont understand the error message when i hover cursor over the error. what is the meaning of this message?
why does it expecting EnumBody
?
Below is the screenshot.
回答1:
For a real explanation, someone would need to do a detailed analysis of the syntax checking, and the syntax error recovery and reporting components of the Eclipse Java compiler front end. But the most likely explanation is that your "unusual" syntax error has "confused" the compiler's syntax error recovery code.
In short it is a minor compiler bug (or feature).
It is likely that the developers know about this, but have refrained from fixing it because:
- it doesn't happen often,
- it might be hard to do a better job ... without breaking some other error recovery cases, and / or
- any change would break a number of compiler error regression tests.
回答2:
For what it's worth, the following:
public class Foo;
Error: Syntax error, insert "ClassBody" to complete ClassBodyDeclarations
public enum Foo;
Error: Syntax error, insert "EnumBody" to complete ClassBodyDeclarations
public interface Foo;
Error Syntax error, insert "InterfaceBody" to complete ClassBodyDeclarations
Anyway, I think what happens is, in this
org.eclipse.jdt.internal.compiler.parser.Parser.consumeEnumConstantHeader()
, it tries to recover when it gets the parsing error with this code:
if(this.currentToken == TokenNameSEMICOLON) {
RecoveredType currentType = currentRecoveryType();
if(currentType != null) {
currentType.insideEnumConstantPart = false;
}
}
So it correctly figures out that we're not inside an enumeration, so we get an error like above, but it doesn't realize that we don't even know if it is an enumeration. You can look at the source here:
In other words, it's probably a bug that the Eclipse team introduced when they added Enumerations, it's handled slightly differently than some of the other tokens, which causes it to be Recovered in a different way and therefore shows up in the compiler errors.
回答3:
This was happening to me in Eclipse too even though my code was correct. Happened because I wrote some code without adding a jar first (aspectJ JARs) and after I added the JAR this issue came about.
At first I copied the code, deleted it, and pasted it back in and thought that worked as the red line went away but errors were thrown at runtime. I did however get it to work by deleting the class, recreating it, and typing the same exact code again and it worked. Copy paste probably would have worked after deleting the class, but I typed it out to be sure.
Definitely a weird problem. I knew the code was right because I was copying it out of a book (Spring in action 4th edition - a good read btw). Anyway, hope this helps you or someone in the future! drove me crazy for about an hour
来源:https://stackoverflow.com/questions/13173070/syntax-error-insert-enumbody-to-complete-enumdeclaration