«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 могут в значительной степени защитить нас от этой ошибки.

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