Code Fix

初級

配列の new と初期化子の書き分け

new int[3] と {1,2,3} の使い分け。角括弧と波括弧の役割の違いを整理します。

エラーメッセージの読み方

Main.java:3: error: ']' expected
Main.java
ファイル名
3
行番号 — javacが異常に気づいた位置。原因の行とは限りません
error
種別 — コンパイルエラー。実行まで到達しません
']' expected
内容 — javacが期待していたもの、または見つけられなかったもの

このエラーが出る典型パターン

パターン1

 1  public class Main {
 2      public static void main(String[] args) {
 3          int[] nums =        int[3];
                            ^
 4          nums[0] = 42;
 5          System.out.println(nums[0]);
 6      }
 7  }
Main.java:3: error: ']' expected

配列は宣言だけでは領域が確保されません。newで実体を作って初めて代入できます。

直し方: (空)new にします。

この問題を解いてみる →

広告
広告スロット(未設定)

パターン2

 1  public class Main {
 2      public static void main(String[] args) {
 3          int[] nums = new int[   ];
                                  ^
 4          System.out.println(nums.length);
 5      }
 6  }
Main.java:3: error: array dimension missing

newで配列を作るときは要素数が必須です。要素数なしで作れるのは初期化子 {1,2,3} を書く場合だけです。

直し方: (空)3 にします。

この問題を解いてみる →

パターン3

 1  public class Main {
 2      public static void main(String[] args) {
 3          int[] nums = [1, 2, 3]  ;
                              ^
 4          System.out.println(nums[1]);
 5      }
 6  }
Main.java:3: error: illegal start of expression

Javaの配列初期化子は角括弧ではなく波括弧です。角括弧は要素へのアクセスと型宣言に使います。

直し方: [1, 2, 3]{1, 2, 3} にします。

この問題を解いてみる →

パターン4

 1  public class Main {
 2      public static void main(String[] args) {
 3          int[] nums = new      {1, 2, 3};
                             ^
 4          System.out.println(nums[0]);
 5      }
 6  }
Main.java:3: error: <identifier> expected

波括弧の初期化子はnewを付けずに書きます。newを付けるなら new int[]{1,2,3} のように型が必要です。

直し方: new (空) にします。

この問題を解いてみる →

パターン5

 1  public class Main {
 2      public static void main(String[] args) {
 3          int[][] grid =        int[2][2];
                              ^
 4          grid[0][0] = 1;
 5          System.out.println(grid[0][0]);
 6      }
 7  }
Main.java:3: error: ']' expected

多次元配列でもnewは省略できません。int[2][2] だけでは式として成立せず、newで確保する必要があります。

直し方: (空)new にします。

この問題を解いてみる →

よくある誤解

int[] nums; と書いた時点で使えると思いがちですが、宣言と実体の確保は別の操作です。

まとめ

配列の new と初期化子の書き分けは初級でつまずきやすい項目です。上の5パターンを実際に手で直すと、エラーメッセージのどこを読めばよいかが掴めます。

演習をはじめる

関連するエラー

広告
広告スロット(未設定)