配列の 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パターンを実際に手で直すと、エラーメッセージのどこを読めばよいかが掴めます。