Thursday, January 13, 2011

Syntax Errors in Java

Summary: Basic syntax errors in Java are explained.





Some errors are caused by violations of the syntax of Java. Although they are easy to understand, there is no easy way to find the exact cause of such errors except by checking the code around the location of the error character by character looking for the syntax error.

...expected

The syntax of Java is very specific about the required punctuation. This error occurs, for example, if you forget a semicolon at the end of a statement or don't balance parentheses:
if (i > j        // Error, unbalanced parentheses
  max = i        // Error, missing semicolon
else
  max = j;
Unfortunately, this syntax error is not necessarily caught precisely at the point of the mistake so you must carefully check the preceding characters in the line or even in a previous line in order to find the problem.
Eclipse:
Syntax error, insert ") Statement" to complete IfStatement
Syntax error, insert ";" to complete Statement
Eclipse is more informative as to the precise syntax error encountered.

unclosed string literal

String literals must be enclosed in quotation marks.1 This error occurs if you fail to terminate the literal with quotation marks. Fortunately, the syntax of Java requires that a string literal appear entirely on one line so the error message appears on the same line as the mistake. If you need a string literal that is longer than a single line, create two or more literals and concatenate them with +:
String longString =
  "This is first half of a long string " +
  "and this is the second half.";
Eclipse: String literal is not properly closed by a double-quote In Eclipse you can write a string literal of arbitrary length and the environment will break the string and insert the +automatically.

illegal start of expression

Most programming constructs are either statements or expressions. This error occurs when an expression is expected but not found. In Java, an assignment statement is considered to be an expression which returns a value, so errors concerning expressions also apply to assignment statements.2 Examples:
  • An extra right parenthesis after the condition of an if-statement:
    if (i > j) )        // Error, extra parenthesis
      max = i;
    
    Eclipse: Syntax error on token ")", delete this token3 Eclipse diagnoses this as a simple syntax error and does not mention expressions.
  • Forgetting the right-hand side of an assignment statement:
    max = ;            // Error, missing right-hand side
    
    Eclipse: Syntax error on token "=", Expression expected after this token

not a statement

This error occurs when a syntactically correct statement does not appear where it should. Examples:
  • Writing an assignment statement without the assignment operator:
    max ;          // Error, missing =
    
    Eclipse: Syntax error, insert "AssignmentOperator Expression"   to complete Expression
  • Misspelling else:
    if (i > j)
      max = i;
    els ;          // Error, else not spelled correctly
    
    The reason you do not get “else expected” is that you need not write an else alternative so this just looks like a bad statement.

    Eclipse:
    els cannot be resolved

    Syntax error, insert "AssignmentOperator Expression" to complete Expression
    The same identifier can be used in different methods and classes. An important task of the compiler is to resolve the ambiguity of multiple uses of the same identifer; for example, if a variable is declared both directly within a class and also within a method, the use of its unqualified name is resolved in favor of the local variable. This error message simply means that the compiler could not obtain an (unambiguous) meaning for the identifier els.
  • The following code:
    if (i > j)
      max = i;
    els           // Error, else not spelled correctly
      max = j;
    
    results in a weird error message:
    x.java:6: cannot find symbol
    symbol  : class els
    location: class x
    els
    
    The reason is that the compiler interprets this as a declaration:
    els max = j;
    
    and can't find a class els as the type of the variable max.
    Eclipse: Duplicate local variable maxels cannot be resolved to a type These messages are more helpful: first, the use of the word type instead of class is more exact because the type of a variable need not be a class (it could be a primitive type or interface); second, the message about the duplicate variable gives an extra clue as to the source of the error.
  • The error can also be caused by attempting to declare a variable whose name is that of a reserved keyword:
    void f() {
      int default = 10;
    }
    
    Eclipse:Syntax error on token "default", invalid VariableDeclaratorId

cannot find symbol

This is probably the most common compile-time error. All identifiers in Java must be declared before being used and an inconsistency between the declaration of an identifier and its use will give rise to this error. Carefully check the spelling of the identifier. It is easy to make a mistake by using a lower-case letter instead of an upper case one, or to confuse the letter O with the numeral 0 and the letter l with the numeral 1.
Other sources of this error are: calling a constructor with an incorrect parameter signature, and using an identifier outside its scope, for example, using an identifier declared in a for-loop outside the loop:
int[] a = {1, 2, 3};
int sum = 0;
for (int i = 0; i < a.length; i++)
  sum = sum + a[i];
System.out.println("Last = " + i);        // Error, i not in scope
Eclipse: ... cannot be resolved

... is already defined in ...

An identifier can only be declared once in the same scope:
int sum = 0;
double sum = 0.0;   // Error, sum already defined
Eclipse: Duplicate local variable sum

array required but ... found

This error is caused by attempting to index a variable which is not an array.
int max(int i, int j) {
  if (i > j) return i;
  else return j[i];              // Error, j is not an array
}
Eclipse: The type of the expression must be an array type but it resolved to int

... has private access in ...

It is illegal to access a variable declared private outside its class.
Eclipse: The field ... is not visible

FOOTNOTES

  1. literal is a source-code representation of a value; most literals are of primitive types like int or char, but there are also literals of type String and the literal null of any reference type.
  2. The value of an assignment statement considered as an expression is the value of the expression on the right-hand side that is assigned to the variable on the left-hand side.
  3. The syntax of a programming language is defined in terms of tokens consisting of one or more characters. Identifiers and reserved keywords are tokens as are single characters like +and sequences of characters like !=.

No comments:

Post a Comment

Related Posts Plugin for WordPress, Blogger...

java

Popular java Topics