«1. Обзор
«Недопустимое начало выражения» — распространенная ошибка, с которой мы можем столкнуться во время компиляции.
В этом уроке мы увидим примеры, иллюстрирующие основные причины этой ошибки и способы ее устранения.
2. Отсутствие фигурных скобок
Отсутствие фигурных скобок может привести к ошибке «недопустимое начало выражения». Давайте сначала рассмотрим пример:
package com.baeldung;
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.baeldung;
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.baeldung;
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.baeldung;
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.baeldung;
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.baeldung;
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 или String без кавычек
Мы знаем, что строковые литералы должны быть заключены в двойной кавычки, а значения char должны быть заключены в одинарные кавычки.
Если мы забудем заключить их в правильные кавычки, компилятор Java будет рассматривать их как имена переменных.
Мы можем увидеть ошибку «невозможно найти символ», если «переменная» не объявлена.
Однако, если мы забудем заключить в двойные кавычки строку, которая не является допустимым именем переменной Java, компилятор Java сообщит об ошибке «недопустимое начало выражения».
Давайте рассмотрим это на примере:
package com.baeldung;
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.baeldung;
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 могут в значительной степени защитить нас от этой ошибки.
Однако время от времени мы все еще можем сталкиваться с этой ошибкой. Таким образом, хорошее понимание ошибки поможет нам быстро найти и исправить ошибку.