質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.50%
多次元配列

1次元配列内にさらに配列を格納している配列を、多次元配列と呼びます。

Java

Javaは、1995年にサン・マイクロシステムズが開発したプログラミング言語です。表記法はC言語に似ていますが、既存のプログラミング言語の短所を踏まえていちから設計されており、最初からオブジェクト指向性を備えてデザインされています。セキュリティ面が強力であることや、ネットワーク環境での利用に向いていることが特徴です。Javaで作られたソフトウェアは基本的にいかなるプラットフォームでも作動します。

Q&A

解決済

4回答

2516閲覧

java多次元配列の実行結果を解説いただけませんでしょうか

BSS_sapporo

総合スコア44

多次元配列

1次元配列内にさらに配列を格納している配列を、多次元配列と呼びます。

Java

Javaは、1995年にサン・マイクロシステムズが開発したプログラミング言語です。表記法はC言語に似ていますが、既存のプログラミング言語の短所を踏まえていちから設計されており、最初からオブジェクト指向性を備えてデザインされています。セキュリティ面が強力であることや、ネットワーク環境での利用に向いていることが特徴です。Javaで作られたソフトウェアは基本的にいかなるプラットフォームでも作動します。

0グッド

0クリップ

投稿2016/04/06 02:00

javaの勉強をしています。
以下のコードで、arr[i]が3となり、
16行目「str += arr[i];」でエラーとなるという事が理解ができません。
解説をお願いできませんでしょうか。
よろしくお願いいたします。

public class Array {

public static void main(String[] args){ int[][] array = new int[4][]; array[0] = new int[3]; array[1] = new int[5]; array[2] = new int[2]; array[3] = new int[4]; for(int[] arr : array) { String str = new String(); for(int i = 0;i < arr.length; i++) { if(i == 0) { arr[i] = ++i; } else { arr[i] = i++; } str += arr[i]; } System.out.print(str); } }

}

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答4

0

解説は他の方が言われている通りです。
実行時エラーの内容(例外)もArrayIndexOutOfBoundsExceptionではないでしょうか。
そのままですが、配列の範囲外にアクセスしようとしたため発生しています。

配列は長さが固定長であること、もしくは、インクリメント演算子(++や--)の性質、for文の変化式の実行されるタイミングのどこかで躓かれているのだと思います。(ソースコードから読み取れます)。

とりあえず、実行時エラーが起きないように修正するには下記のようにしてください。
(ただし、意図どおりの動きかはわかりません)

Java

1public class Array { 2 3 public static void main(String[] args){ 4 int[][] array = new int[4][]; 5 array[0] = new int[3]; //indexが0~2までの長さ3の配列 6 array[1] = new int[5]; //indexが0~5までの長さ5の配列 7 array[2] = new int[2]; //indexが0~1までの長さ2の配列 8 array[3] = new int[4]; //indexが0~3までの長さ4の配列 9 10 for(int[] arr : array) { 11 String str = new String(); 12 13 for(int i = 0;i < arr.length; i++) { 14 if(i == 0) { 15 arr[i] = i+1; 16 } else { 17 arr[i] =18 } 19 str += arr[i]; 20 } 21 /* 22 上のfor文は下記のように書き換えても良いです。 23 が分かりづらいのでおすすめしません。 24 for(int i = 0;i < arr.length; ) { 25 if(i == 0) { 26 /* 27 iはインクリメントされているので、 28 配列にアクセスするときには-1にしましょう。 29 普通このような書き方はしませんが。 30 */ 31 arr[i-1] = ++32 } else { 33 arr[i-1] = i++; 34 } 35 str += arr[i]; 36 } 37 */ 38 System.out.print(str); 39 } 40 } 41}

投稿2016/04/06 02:42

編集2016/04/06 02:45
Odacchi

総合スコア907

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

BSS_sapporo

2016/04/06 02:48

ArrayIndexOutOfBoundsException でした! for(int[] arr : array) { でアクセスするのがarray[0]の中というのがポイントだったのですね。 ありがとうございます!
guest

0

処理結果を順に見ていくと恐らく下のようになります。
恐らく色々意図しない結果が出ているはずです。

for文に入る前の配列初期化時点でarrayの状況はこうで
[
[0,0,0]
,[0,0,0,0,0]
,[0,0]
,[0,0,0,0]
]

ループ一回目
arr[i] = ++i; // -> [[1,0,0]....] i=1 ※++iは加算してから評価
str += arr[i]; // -> str=1

ループ二回目
arr[i] = i++; // -> [[1,1,0]....] i=2 ※i++は評価してから加算
str += arr[i]; // -> str=1 ※この時点のarr[2]は0

ループ三回目
arr[i] = i++; // -> [[1,1,2]....] i=3
str += arr[i]; // -> error ※arr[3]は存在しないため

投稿2016/04/06 02:42

編集2016/04/06 03:00
hirohiro

総合スコア2068

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

BSS_sapporo

2016/04/06 02:46

arrの要素は[0][1][2]なのにループした結果、arr[3]となってしまったためエラーとなるのですね、、! ようやっと理解が深まりました! ありがとうございます!
swordone

2016/04/06 02:49 編集

一つ訂正を加えるなら、intの配列は作成時に要素はすべて0で初期化されます(nullではない、と言うかintにnullはない)。 もひとつ訂正、ループ1回目で代入する先はarr[0]です。++の処理は代入の値決定時に処理されるので、その前の代入の位置を決める際には影響しません。
hirohiro

2016/04/06 02:49

ォォ。これはご指摘ありがとうございます。 修正しておきます
BSS_sapporo

2016/04/06 02:51

intの配列はすべて0で初期化され、そこへループの結果の値が代入されていくのですね。 ループの流れが考えている間にわからなくなってしまったりしていたので助かりました。 ありがとうございます!
guest

0

ループ開始時に「i=3」だとしても、ループ内で「i++」してるので「arr[i]」のときにはi=4になってますよ。

投稿2016/04/06 02:20

tkturbo

総合スコア5572

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

BSS_sapporo

2016/04/06 02:32

arrの要素数は「3」なのに対し、arr[i] = i++; で「4」になってしまい、 要素数を超えてしまっているためエラーになる、 という解釈で間違ってないでしょうか。 勉強不足で申し訳ございません。。
tkturbo

2016/04/06 03:15

それであってます
BSS_sapporo

2016/04/06 07:41

ありがとうございます、理解することができました!
guest

0

ベストアンサー

i++++iは、i自体の値が書き換わります。
そのため、例えばarray[0]の長さ3のint配列arrに対し、for文中i=2で入ったとすると、
arr[2]に2が代入され、iは1増えて3になります。
結果、elseを抜けたあとのstr += arr[i];で**arr[3]**にアクセスしようとします。
しかしarrは長さ3で、インデックス3はないため例外となります。


最初からfor文の動きを追うと…
arrayから最初の配列array[0]をarrとして扱い、ループ開始
新たな空のStringを生成
i=0でループ開始、arr.lengthは3より小さいのでループに入る
i=0なのでarr[i] = ++i;を実行、arr[0]に、**iを1増やし(i=1になる)**その結果が代入される。
str += arr[i];i=1なので、strにarr[1]、つまりデフォルトの0が文字列化され追加される
i++でiは1増加し2になる。arr.lengthの3より小さいのでループ続行
iが0でないのでarr[i] = i++;が実行。arr[2]にi(=2)を代入し、iを1増やす(i=3になる)。
str += arr[i];i=3のためarr[3]にアクセスしようとするが、長さ3の配列にインデックス3は存在しないため、ArrayIndexOutOfBoundsException発生。

投稿2016/04/06 02:11

編集2016/04/06 02:44
swordone

総合スコア20649

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

BSS_sapporo

2016/04/06 02:17

知識が無くて申し訳ございません、 arrの長さはなぜ、3になるのでしょうか。
swordone

2016/04/06 02:19

ご自分でarray[0] = new int[3]; と初期化してますよね? 最初のfor文 for(int[] arr : array) で、最初にアクセスされるのがこの長さ3の配列になります。
BSS_sapporo

2016/04/06 02:30

array[0] = new int[3]にアクセスしに行くということなのですね! eラーニングで学んでおり、この点についての説明がなかったので、理解できておりませんでした。 ありがとうございます!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.50%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問