Java での識別子の予期されるエラー

Suraj P 2023年10月12日
  1. Java の <identifier> expected エラーを理解する
  2. 例 1: メソッドのパラメーターにデータ型または名前がない場合
  3. 例 2: 式ステートメントが間違っている場合
  4. 例 3: 宣言ステートメントが間違っている場合
  5. まとめ
Java での識別子の予期されるエラー

この記事では、Java の <identifier> expected エラーについて学習します。

Java の <identifier> expected エラーを理解する

<identifier> expected は、初心者プログラマーが直面する最も一般的な Java コンパイル時エラーです。 このエラーは、メソッド パラメーターにデータ型または名前が宣言されていない場合、または式ステートメントがメソッド、コンストラクター、または初期化ブロックの外に記述されている場合に発生します。

Java では、識別子は 1つ以上の文字のシーケンスであり、最初の文字は文字または $ または _ である必要があり、その後の文字は文字、数字、$ または _ にすることができます。

これらの識別子は、変数、メソッド、クラス、パッケージ、インターフェースなどに名前を付けるために使用されます。

Java コードがコンパイルされるとき、最初のフェーズにはプログラムの字句解析が含まれます。 ここで、プログラムはトークンに分類され、識別子を含むすべてのトークンが一連の文法規則に対して検証されます。

そして、文法規則に従って、識別子が期待されているが、それが存在せず、その場所に他の何かが見つかった場合はいつでも、コンパイラは <identifier> expected エラーを発生させます。 ここでの山かっこは、トークン オブジェクトへの参照を意味します。

よりよく理解するために、いくつかの例を見てみましょう。

例 1: メソッドのパラメーターにデータ型または名前がない場合

メソッド内のパラメーターには、データの後に識別子である変数名が続く必要があります。 これらのいずれかが欠けていると、必然的に <identifier> expected エラーが発生します。

  1. パラメータのデータが欠落している

    public class Demo {
      public static int square(x) {
        return x * x;
      }
    
      public static void main(String[] args) {
        System.out.println(square(10));
      }
    }
    

    出力:

    square.java:9: error: <identifier> expected
    public static int square(x) {
            	        	  ^
    1 error
    

    上記のエラーを確認すると、変数 x にデータ型がないことがわかります。 データ型を指定すると、適切に機能します。

    public class Demo {
      public static int square(int x) {
        return x * x;
      }
    
      public static void main(String[] args) {
        System.out.println(square(10));
      }
    }
    

    出力:

    100
    
  2. パラメータのデータ型は識別子です。 ここには変数名がありません。

    public class Demo {
      public static int square(int) {
        return x * x;
      }
    
      public static void main(String[] args) {
        System.out.println(square(10));
      }
    }
    

    出力:

    square.java:9: error: <identifier> expected
    public static int square(int) {
            	        	   ^
    1 error
    

    上記のエラーを観察すると、データ型を指定したが、変数名を付けていないことがはっきりとわかります。

    public class Demo {
      public static int square(int x) {
        return x * x;
      }
    
      public static void main(String[] args) {
        System.out.println(square(10));
      }
    }
    

    出力:

    100
    

例 2: 式ステートメントが間違っている場合

メソッド、コンストラクター、または初期化ブロック <identifier> expected の外に式ステートメントが記述されている場合、コンパイラーはエラーを発生させます。

コード例:

public class Demo {
  private String name;
  name = "Naruto";
  System.out.println(name);
}

出力:

Demo.java:9: error: <identifier> expected
  name = "Naruto";
      ^
Demo.java:10: error: <identifier> expected
  System.out.println(name);
                    ^
Demo.java:10: error: <identifier> expected
  System.out.println(name);
                        ^
3 errors

上記のエラーが発生した場合、ステートメントが関数またはコンストラクターで囲まれていないためにエラーが発生します。 print という名前のメソッド内にこれらのステートメントを書きましょう。

public class Demo {
  private String name;

  public void print() {
    name = "Naruto";
    System.out.println(name);
  }

  public static void main(String[] args) {
    Demo obj = new Demo();
    obj.print();
  }
}

出力:

Naruto

例 3: 宣言ステートメントが間違っている場合

これはめったにありませんが、try-with-resources ステートメントを使用する場合は前代未聞ではありません。 これらすべてのステートメントでは、try キーワードの直後にクローズ可能なリソースを宣言する必要があります。

リソース変数が try-with-resources ステートメントの外で宣言されている場合、コンパイラによって <identifier> expected エラーが発生する可能性があります (コンパイラごとに異なる場合があります)。

コード例: ここでは、クローズ可能なリソースは BufferedReader です。

import java.io.*;

public class Demo {
  public static void main(String[] args) {
    StringBuilder obj = new StringBuilder();
    BufferedReader br = null;

    try (br = new BufferedReader(new InputStreamReader(System.in))) {
      String lines = "";
      while (!(lines = br.readLine()).isBlank()) {
        obj.append(lines);
      }
    } catch (Exception e) {
      e.printStackTrace();
    }
  }
}

出力:

Demo.java:13: error: <identifier> expected
        try (br = new BufferedReader(new InputStreamReader(System.in))) {
              ^
1 error

try ブロック内で BufferedReader obj を宣言すると、エラーは解決されます。

import java.io.*;

public class Demo {
  public static void main(String[] args) {
    StringBuilder obj = new StringBuilder();

    try (BufferedReader br = new BufferedReader(new InputStreamReader(System.in))) {
      String lines = "";
      while (!(lines = br.readLine()).isBlank()) {
        obj.append(lines);
      }
    } catch (Exception e) {
      e.printStackTrace();
    }
  }
}

まとめ

この記事では、<identifier> expected エラーがコンパイラによって発生した理由と、初心者が直面する最も一般的なコンパイル時エラーである理由について学びました。 また、このエラーが発生したケースを分析するさまざまな例も調べました。

著者: Suraj P
Suraj P avatar Suraj P avatar

A technophile and a Big Data developer by passion. Loves developing advance C++ and Java applications in free time works as SME at Chegg where I help students with there doubts and assignments in the field of Computer Science.

LinkedIn GitHub

関連記事 - Java Error