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

private アクセス修飾子を削除すると、問題が簡単に解決されます。

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コンパイラは5つのコンパイルエラーを報告します。 場合によっては、単一のエラーがコンパイル時にさらに複数のエラーを引き起こす可能性があります。

問題を解決するには、根本的な原因を特定することが不可欠です。 この例では、最初の「不正な式の開始」エラーが根本的な原因です。

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引用符なし

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メソッドの呼び出し内でString + を引用するのを忘れました。また、+は明らかに有効なJava変数名ではありません。

それでは、コンパイルしてみましょう。

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

この問題の解決策は簡単です— Stringリテラルを二重引用符で囲みます。

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. 結論

この短い記事では、「違法な表現の開始」エラーを引き起こす5つの異なるシナリオについて説明しました。

ほとんどの場合、Javaアプリケーションを開発するときは、エラーが検出されると警告するIDEを使用します。 これらの優れたIDE機能は、このエラーに直面することから私たちを保護するのに大いに役立ちます。

ただし、それでも時々エラーが発生する可能性があります。 したがって、エラーをよく理解すると、エラーをすばやく見つけて修正するのに役立ちます。