teratail header banner
teratail header banner
質問するログイン新規登録

回答編集履歴

2

例外の種類

2016/04/06 02:44

投稿

swordone
swordone

スコア20675

answer CHANGED
@@ -13,4 +13,4 @@
13
13
  `str += arr[i];`i=1なので、strにarr[1]、つまりデフォルトの0が文字列化され追加される
14
14
  i++でiは1増加し2になる。arr.lengthの3より小さいのでループ続行
15
15
  iが0でないので`arr[i] = i++;`が実行。arr[2]にi(=2)を代入し、**iを1増やす(i=3になる)。**
16
- `str += arr[i];`i=3のためarr[3]にアクセスしようとするが、長さ3の配列にインデックス3は存在しないため、IndexOutOfBoundsException発生。
16
+ `str += arr[i];`i=3のためarr[3]にアクセスしようとするが、長さ3の配列にインデックス3は存在しないため、ArrayIndexOutOfBoundsException発生。

1

実行の流れ

2016/04/06 02:44

投稿

swordone
swordone

スコア20675

answer CHANGED
@@ -2,4 +2,15 @@
2
2
  そのため、例えばarray[0]の長さ3のint配列arrに対し、for文中i=2で入ったとすると、
3
3
  arr[2]に2が代入され、**iは1増えて3になります。**
4
4
  結果、elseを抜けたあとの`str += arr[i];`で**arr[3]**にアクセスしようとします。
5
- しかしarrは長さ3で、インデックス3はないため例外となります。
5
+ しかしarrは長さ3で、インデックス3はないため例外となります。
6
+
7
+ ---
8
+ 最初からfor文の動きを追うと…
9
+ arrayから最初の配列array[0]をarrとして扱い、ループ開始
10
+ 新たな空のStringを生成
11
+ i=0でループ開始、arr.lengthは3より小さいのでループに入る
12
+ i=0なので`arr[i] = ++i;`を実行、arr[0]に、**iを1増やし(i=1になる)**その結果が代入される。
13
+ `str += arr[i];`i=1なので、strにarr[1]、つまりデフォルトの0が文字列化され追加される
14
+ i++でiは1増加し2になる。arr.lengthの3より小さいのでループ続行
15
+ iが0でないので`arr[i] = i++;`が実行。arr[2]にi(=2)を代入し、**iを1増やす(i=3になる)。**
16
+ `str += arr[i];`i=3のためarr[3]にアクセスしようとするが、長さ3の配列にインデックス3は存在しないため、IndexOutOfBoundsException発生。