Перейти к основному содержимому

Ошибка компилятора Java: недопустимое начало выражения

· 5 мин. чтения

1. Обзор

«Недопустимое начало выражения» — распространенная ошибка, с которой мы можем столкнуться во время компиляции.

В этом руководстве мы увидим примеры, иллюстрирующие основные причины этой ошибки и способы ее устранения.

2. Отсутствие фигурных скобок

Отсутствие фигурных скобок может привести к ошибке «недопустимое начало выражения». Сначала рассмотрим пример:

package com.foreach;

public class MissingCurlyBraces {
public void printSum(int x, int y) {
System.out.println("Calculation Result:" + calcSum(x, y));

public int calcSum(int x, int y) {
return x + y;
}
}

Если мы скомпилируем вышеуказанный класс:

$ javac MissingCurlyBraces.java
MissingCurlyBraces.java:7: error: illegal start of expression
public int calcSum(int x, int y) {
^
MissingCurlyBraces.java:7: error: ';' expected
public int calcSum(int x, int y) {
.....

Отсутствие закрывающей фигурной скобки printSum() является основной причиной проблемы.

Решение проблемы простое — добавление закрывающей фигурной скобки в метод printSum() :

package com.foreach;

public class MissingCurlyBraces {
public void printSum(int x, int y) {
System.out.println("Calculation Result:" + calcSum(x, y));
}
public int calcSum(int x, int y) {
return x + y;
}
}

Прежде чем мы перейдем к следующему разделу, давайте рассмотрим ошибку компилятора.

Компилятор сообщает, что 7-я строка вызывает ошибку «недопустимое начало выражения». На самом деле мы знаем, что первопричина проблемы кроется в 6-й строке. Из этого примера мы узнаем, что иногда ошибки компилятора не указывают на строку с первопричиной , и нам нужно исправить синтаксис в предыдущей строке.

3. Модификатор доступа внутри метода

В Java мы можем объявлять локальные переменные только внутри метода или конструктора . Мы не можем использовать какие -либо модификаторы доступа для локальных переменных внутри метода, потому что их доступность определяется областью действия метода.

Если мы нарушим правило и будем иметь модификаторы доступа внутри метода, возникнет ошибка «недопустимое начало выражения».

Давайте посмотрим на это в действии:

package com.foreach;

public class AccessModifierInMethod {
public void printSum(int x, int y) {
private int sum = x + y;
System.out.println("Calculation Result:" + sum);
}
}

Если мы попытаемся скомпилировать приведенный выше код, мы увидим ошибку компиляции:

$ javac AccessModifierInMethod.java 
AccessModifierInMethod.java:5: error: illegal start of expression
private int sum = x + y;
^
1 error

Удаление модификатора приватного доступа легко решает проблему:

package com.foreach;

public class AccessModifierInMethod {
public void printSum(int x, int y) {
int sum = x + y;
System.out.println("Calculation Result:" + sum);
}
}

4. Вложенные методы

Некоторые языки программирования, такие как Python, поддерживают вложенные методы. Но Java не поддерживает метод внутри другого метода.

Мы столкнемся с ошибкой компилятора «недопустимое начало выражения», если создадим вложенные методы:

package com.foreach;

public class NestedMethod {
public void printSum(int x, int y) {
System.out.println("Calculation Result:" + calcSum(x, y));
public int calcSum ( int x, int y) {
return x + y;
}
}
}

Давайте скомпилируем приведенный выше исходный файл и посмотрим, что сообщает компилятор Java:

$ javac NestedMethod.java
NestedMethod.java:6: error: illegal start of expression
public int calcSum ( int x, int y) {
^
NestedMethod.java:6: error: ';' expected
public int calcSum ( int x, int y) {
^
NestedMethod.java:6: error: <identifier> expected
public int calcSum ( int x, int y) {
^
NestedMethod.java:6: error: not a statement
public int calcSum ( int x, int y) {
^
NestedMethod.java:6: error: ';' expected
public int calcSum ( int x, int y) {
^
5 errors

Компилятор Java сообщает о пяти ошибках компиляции. В некоторых случаях одна ошибка может вызвать несколько других ошибок во время компиляции.

Выявление основной причины важно для нас, чтобы иметь возможность решить проблему. В этом примере основной причиной является первая ошибка «недопустимое начало выражения».

Мы можем быстро решить проблему, переместив метод calcSum() из метода printSum() :

package com.foreach;

public class NestedMethod {
public void printSum(int x, int y) {
System.out.println("Calculation Result:" + calcSum(x, y));
}
public int calcSum ( int x, int y) {
return x + y;
}
}

5. char или строка без кавычек

Мы знаем, что строковые литералы должны заключаться в двойные кавычки, а значения char должны заключаться в одинарные кавычки.

Если мы забудем заключить их в правильные кавычки, компилятор Java будет рассматривать их как имена переменных .

Мы можем увидеть ошибку «невозможно найти символ», если «переменная» не объявлена.

Однако, если мы забудем заключить в двойные кавычки строку , которая не является допустимым именем переменной Java, компилятор Java сообщит об ошибке «недопустимое начало выражения» .

Давайте посмотрим на это на примере:

package com.foreach;

public class ForgetQuoting {
public int calcSumOnly(int x, int y, String operation) {
if (operation.equals(+)) {
return x + y;
}
throw new UnsupportedOperationException("operation is not supported:" + operation);
}
}

Мы забыли заключить строку + в кавычки внутри вызова метода equals , а + явно не является допустимым именем переменной Java.

Теперь попробуем его скомпилировать:

$ javac ForgetQuoting.java 
ForgetQuoting.java:5: error: illegal start of expression
if (operation.equals(+)) {
^
1 error

Решение проблемы простое — заключать строковые литералы в двойные кавычки:

package com.foreach;

public class ForgetQuoting {
public int calcSumOnly(int x, int y, String operation) {
if (operation.equals("+")) {
return x + y;
}
throw new UnsupportedOperationException("operation is not supported:" + operation);
}
}

6. Заключение

В этой короткой статье мы рассказали о пяти различных сценариях, которые вызовут ошибку «недопустимое начало выражения».

Большую часть времени при разработке Java-приложений мы будем использовать IDE, которая предупреждает нас при обнаружении ошибок. Эти приятные функции IDE могут в значительной степени защитить нас от этой ошибки.

Тем не менее, мы все еще можем время от времени сталкиваться с ошибкой. Таким образом, хорошее понимание ошибки поможет нам быстро найти и исправить ошибку.