- 総合バグ修正問題 31~50(応用・発展)
- 問題 31:ジャグ配列のサイズ未設定
- 問題 32:ジャグ配列の長さを固定で回す
- 問題 33:3次元配列の表示ミス
- 問題 34:3次元配列の範囲外アクセス
- 問題 35:ArrayList<2D配列> の null 代入ミス
- 問題 36:ArrayList の初期容量の誤解
- 問題 37:ArrayList<多次元配列> + toArray の落とし穴
- 問題 38:多次元配列の shallow copy ミス
- 問題 39:3次元配列の shallow copy ミス
- 問題 40:ArrayList<配列> の shallow copy ミス
- 問題 41:3次元 ArrayList + 表示ミス
- 問題 42:配列の追加位置を勘違い
- 問題 43:多次元配列の結合ミス
- 問題 44:配列コピー時のサイズミス
- 問題 45:ArrayList の remove ミス
- 問題 46:深い階層の ArrayList を誤って表示
- 問題 47:2D ArrayList の null 行ミス
- 問題 48:多次元 ArrayList の要素アクセスミス
- 問題 49:ArrayList + 2D 配列の書き換えミス
- 問題 50:3D ArrayList の深すぎる null ミス
総合バグ修正問題 31~50(応用・発展)
問題 31:ジャグ配列のサイズ未設定
int[][] arr = new int[3][];
arr[0][0] = 10;
Java❌ 間違い
arr[0] が null → NullPointerException
✅ 修正
arr[0] = new int[1];
arr[0][0] = 10;
Java問題 32:ジャグ配列の長さを固定で回す
int[][] arr = {{1,2},{3,4,5}};
for(int i=0;i<2;i++){
for(int j=0;j<3;j++){
System.out.println(arr[i][j]);
}
}
Java❌ 間違い
arr[0] に index 2 は存在しない → IndexOutOfBounds
✅ 修正
for(int i=0;i<arr.length;i++){
for(int j=0;j<arr[i].length;j++){
System.out.println(arr[i][j]);
}
}
Java問題 33:3次元配列の表示ミス
int[][][] cube = new int[2][2][2];
System.out.println(Arrays.toString(cube));
Java❌ 間違い
3次元配列 → deepToString を使う必要あり
✅ 修正
System.out.println(Arrays.deepToString(cube));
Java問題 34:3次元配列の範囲外アクセス
int[][][] cube = new int[2][2][2];
cube[1][2][0] = 5;
Java❌ 間違い
第2次元のインデックス 2 → 範囲外
✅ 修正
cube[1][1][0] = 5;
Java問題 35:ArrayList<2D配列> の null 代入ミス
ArrayList<int[][]> list = new ArrayList<>();
list.add(new int[2][2]);
list.add(null);
System.out.println(Arrays.deepToString(list.get(1)));
Java❌ 間違い
null を deepToString に渡すと NullPointerException
✅ 修正
list.set(1, new int[1][1]);
System.out.println(Arrays.deepToString(list.get(1)));
Java問題 36:ArrayList の初期容量の誤解
ArrayList<int[]> list = new ArrayList<>(10);
list.get(0)[0] = 1;
Java❌ 間違い
容量 10 は「空のまま10入る」だけ → get(0) はできない
✅ 修正
list.add(new int[1]);
list.get(0)[0] = 1;
Java問題 37:ArrayList<多次元配列> + toArray の落とし穴
ArrayList<int[][]> list = new ArrayList<>();
list.add(new int[][]{{1,2},{3,4}});
System.out.println(Arrays.deepToString((int[][])list.toArray()[0]));
Java❌ 間違い
toArray() の戻り値は Object[]
→ (int[][]) ではなく (int[][]) ではキャスト不可
✅ 修正
System.out.println(Arrays.deepToString(list.get(0)));
Java問題 38:多次元配列の shallow copy ミス
int[][] arr = {{1,2},{3,4}};
int[][] copy = arr.clone();
copy[0][0] = 99;
System.out.println(arr[0][0]);
Java❌ 間違い
clone() は shallow copy → 内部配列は共有される
→ arr[0][0] も 99 になる
✅ 修正
深いコピーをする
int[][] arr = {{1,2},{3,4}};
int[][] copy = new int[arr.length][];
for(int i=0;i<arr.length;i++){
copy[i] = arr[i].clone();
}
Java問題 39:3次元配列の shallow copy ミス
int[][][] cube = {{{1},{2}},{{3},{4}}};
int[][][] copy = cube.clone();
copy[0][0][0] = 99;
System.out.println(cube[0][0][0]);
Java❌ 間違い
やはり shallow copy → 最深部までコピーされない
✅ 修正(deep copy)
int[][][] copy = new int[cube.length][][];
for(int i=0;i<cube.length;i++){
copy[i] = new int[cube[i].length][];
for(int j=0;j<cube[i].length;j++){
copy[i][j] = cube[i][j].clone();
}
}
Java問題 40:ArrayList<配列> の shallow copy ミス
ArrayList<int[]> list = new ArrayList<>();
list.add(new int[]{1,2});
ArrayList<int[]> copy = (ArrayList<int[]>) list.clone();
copy.get(0)[0] = 99;
System.out.println(list.get(0)[0]);
Java❌ 間違い
clone() は shallow → 配列は共有される
✅ 修正
ArrayList<int[]> copy = new ArrayList<>();
for(int[] a : list){
copy.add(a.clone());
}
Java問題 41:3次元 ArrayList + 表示ミス
ArrayList<int[][][]> list = new ArrayList<>();
list.add(new int[1][1][1]);
System.out.println(Arrays.toString(list.get(0)));
Java❌ 間違い
3次元配列の表示に toString は使えない
✅ 修正
System.out.println(Arrays.deepToString(list.get(0)));
Java問題 42:配列の追加位置を勘違い
int[] a = {1,2};
int[] b = {3,4};
int[] c = new int[a.length + b.length];
for(int i=0;i<=a.length;i++){
c[i] = a[i];
}
Java❌ 間違い
i <= a.length → 範囲外アクセス
IndexOutOfBounds
✅ 修正
for(int i=0;i<a.length;i++){
c[i] = a[i];
}
Java問題 43:多次元配列の結合ミス
int[][] a = {{1,2}};
int[][] b = {{3,4}};
int[][] c = new int[a.length + b.length][];
for(int i=0;i<=a.length;i++){
c[i] = a[i];
}
Java❌
同じく <= ミス
✅ 修正
for(int i=0;i<a.length;i++){
c[i] = a[i];
}
Java問題 44:配列コピー時のサイズミス
int[] src = {1,2,3};
int[] dst = new int[2];
System.arraycopy(src,0,dst,0,3);
Java❌
dst が 2 → 3 要素コピーは無理
✅ 修正
System.arraycopy(src,0,dst,0,2);
Java問題 45:ArrayList の remove ミス
ArrayList<int[]> list = new ArrayList<>();
list.add(new int[]{1,2});
list.remove(new int[]{1,2});
Java❌
remove(obj) は参照一致
→ 同じ内容でも別配列なので削除されない
よくある初学者バグ
✅ 修正
list.remove(0);
Java問題 46:深い階層の ArrayList を誤って表示
ArrayList<ArrayList<int[]>> data = new ArrayList<>();
ArrayList<int[]> inner = new ArrayList<>();
inner.add(new int[]{1,2});
data.add(inner);
System.out.println(data);
Java❌
配列の中身が表示されない
int[] → アドレス表示
✅ 修正
for(ArrayList<int[]> list : data){
for(int[] a : list){
System.out.println(Arrays.toString(a));
}
}
Java問題 47:2D ArrayList の null 行ミス
ArrayList<ArrayList<Integer>> grid = new ArrayList<>();
grid.add(null);
grid.get(0).add(10);
Java❌
grid.get(0) が null → NullPointerException
✅ 修正
grid.set(0, new ArrayList<>());
grid.get(0).add(10);
Java問題 48:多次元 ArrayList の要素アクセスミス
ArrayList<ArrayList<int[]>> data = new ArrayList<>();
data.add(new ArrayList<>());
data.get(0).add(new int[]{1,2});
System.out.println(data.get(1).get(0)[0]);
Java❌
data.get(1) は存在しない
✅ 修正
System.out.println(data.get(0).get(0)[0]);
Java問題 49:ArrayList + 2D 配列の書き換えミス
ArrayList<int[][]> list = new ArrayList<>();
int[][] arr = {{1,2},{3,4}};
list.add(arr);
list.get(0)[0][2] = 99;
Java❌
arr[0] は長さ 2 → index 2 はなし
✅ 修正
list.get(0)[0][1] = 99;
Java問題 50:3D ArrayList の深すぎる null ミス
ArrayList<int[][][]> list = new ArrayList<>();
int[][][] arr = new int[1][1][];
arr[0][0][0] = 10;
Java❌ 間違い
arr[0][0] が null → さらにその 0 番目アクセス → NullPointerException
✅ 修正
arr[0][0] = new int[1];
arr[0][0][0] = 10;
Java
