- ベストアンサー
Loop後に変数が出力できないです
最後のprintlnで、LabelBreak.java:13: シンボルを解釈処理できません。とi j kの変数が解釈できずコンパイルが失敗しますがなぜでしょうか? class LabelBreak { public static void main(String[] args) { for(int i = 0; i < 10; i++) { label1: for(int j = 0; j < 10; j++) { for(int k = 0; k < 10; k++) { System.out.println("i = " + i + ", j = " + j + ", k = " + k); if(k == 3) break label1; } } } System.out.println("Loop end"); System.out.println("i = " + i + ", j = " + j + ", k = " + k); } } ^
- みんなの回答 (2)
- 専門家の回答
質問者が選んだベストアンサー
- ベストアンサー
おや?投稿したはずが反映されていないので、もう一度。 重複したときは失礼。 Java の変数には二種類あります。 ・クラスのメンバーになる変数(フィールド) ・ローカル変数 フィールドはクラスをインスタンス化したオブジェクト固有のもので、オブジェクトと共に持続します。メモリ上の領域を占有するという事です。 ローカル変数は暮らすのメソッド内で定義されており、制御がメソッドを抜ければメモリ上から消失します。 フィールドは初期化しないでも省略値が代入されるので使えますが、ローカル変数は明示的に初期化しないとコンパイル時にエラーになります。 // 初期化方法1: int i; i=0; // 初期化方法2: int j = 0; さらに、クラスはブロックの階層で考える事が出来て、下層階層でだけ初期化してもコンパイルエラーになります。 ブロックとは { から } までの間の事です。 1.簡単な例 int sum = 0; for (int i = 0; i < 10; i++) { sum = sum + i; } System.out.println(i + ", " + sum); このとき、 i は for ブロック内で定義されているので制御がループを抜けるとメモリ上からドロップされて使えなくなります。 2.ややこしい例 int i, sum; for (i = 0; i < 10; i++) { sum = sum + i; } System.out.println(i + ", " + sum); このときは、定義された階層以下のブロック内で初期化されているので、コンパイラはループの外では定義されていないかもしれない危険性を鑑み、コンパイルエラーを出します。ブロック内というのは、実行時の状況によっては制御が移らないかもしれないので、コンパイル時には別個のものとして解析されているのです。 うまく説明できませんが、これで分かるでしょうか?
その他の回答 (1)
- wolv
- ベストアンサー率37% (376/1001)
変数j, kは, i によるfor ループのブロックの中で宣言されたローカル変数なので, そのブロックの外からは参照できません. (C だったらこうだと思うんですが,Javaでもそうではないですか?) 上が正しいなら, public... の直後で i,j,k を宣言してしまえば うまくいくような気がします.