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 могут в значительной степени защитить нас от этой ошибки.
Тем не менее, мы все еще можем время от времени сталкиваться с ошибкой. Таким образом, хорошее понимание ошибки поможет нам быстро найти и исправить ошибку.