• ベストアンサー

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); } } ^

  • Java
  • 回答数2
  • ありがとう数0

質問者が選んだベストアンサー

  • ベストアンサー
noname#4486
noname#4486
回答No.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)
回答No.1

変数j, kは, i によるfor ループのブロックの中で宣言されたローカル変数なので, そのブロックの外からは参照できません. (C だったらこうだと思うんですが,Javaでもそうではないですか?) 上が正しいなら, public... の直後で i,j,k を宣言してしまえば うまくいくような気がします.

関連するQ&A

  • javaのプログラムについて

    java始めたばかりの者です。 class sample1 { public static void main(String[] args) { for(int i=1; i<=5; i++){ for(int j=0; j<i; j++){ System.out.println("*"); } System.out.println("\n"); } } } これを実行すると * * * * * * * * * * * * * * * こうなってしまい * ** *** **** ***** このようにするにはどうしたらいいのでしょうか??

    • ベストアンサー
    • Java
  • 配列を使った・・・。

    配列を使って簡単な迷路を作っているのですが、なかなかうまくいきません。 0を" "1を"■"を表示させたいのですがうまくいきません。 何処を直せばいいのか教えてください。 public class Sample1 { public static void main (String[]args) { int [][] data = { {1,0,1,1,1,1,1,1,1,1,0,1,1,1,1,1,1,1,1,1}, {1,0,1,1,0,0,0,1,1,1,0,1,1,1,1,1,0,1,1,1}, {1,0,0,0,0,1,0,0,0,1,0,0,0,1,1,1,0,1,1,1}, {1,1,1,1,1,1,1,1,0,1,0,1,0,1,1,0,0,1,1,1}, {1,1,1,1,1,0,0,0,0,1,0,1,0,0,0,0,1,1,1,1}, {1,1,1,1,1,0,1,1,0,0,0,1,1,1,1,1,1,1,1,1}, {1,1,1,1,0,0,1,1,0,1,0,1,1,1,0,1,1,1,1,1}, {1,1,1,1,0,1,1,1,1,1,0,1,1,1,0,0,0,1,1,1}, {1,1,1,0,0,1,1,1,1,1,0,0,0,0,0,1,1,1,1,1}, {1,1,1,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1} }; for (int i=0; i<10; i++) { for (int j=0; j<20; j++) { System.out.print(data [i][j]); } if(data [i][j] = 1){ System.out.println("■"); }else{ System.out.println(" "); } } } }

    • ベストアンサー
    • Java
  • java ネストしたfor文について

    ***** **** *** ** * 上のように*が減るようにしたいのですが下のソースではどこが悪いか教えてください class TestGoo{ public static void main(String args[]){ for(int i = 5; i>=1; i--){ for(int j = 5;j>=1; j--){ System.out.print('*'); } System.out.println(); } } }

  • 文字列を整数に型変換してソート

    コマンドライン入力で文字列を入力してそれを整数型に変換。そして、それをソートするプログラムを作ってるんですが、なぜかうまくいかず、出力される数字がすべて0になります。 どなたかヘルプおねがいします>< class sort32 { public static void main(String[] args) { System.out.println("------------------------"); int i=0; int j=i+1; int vals[]; vals = new int[args.length]; for(i=0;i>args.length ;i++) { vals[i] = Integer.parseInt(args[i]); } java.util.Arrays.sort(vals); for(int k=0; k<vals.length; k++) System.out.println("<"+vals[k]+">"); } }

  • for文について

    for文を使って、以下のような図形を作成してますが、 どうしてもうまく作れません。 どなたか教えていただけないでしょうか? 現在出来ているソースは次のようです。 まるで異なる図形になってしまいますが。 public class kurikaeshi { public static void main(String[] args) { int i = 0, j = 0, k = 0, l=0; for(i = 0; i < 10; i++) { for(j = 0; j < i + 1; j++) { for(k = 0; k < 2*j; k++) { System.out.print(" "); } for(l = 0; l < (2*i + 1) - 2*k; l++) { System.out.print("*"); } System.out.println(); } } } } + +++ + +++++ +++ + +++++++ +++++ +++ + +++++++++ +++++++ +++++ +++ + +++++++++++ +++++++++ +++++++ +++++ +++ +

  • break ラベルの挙動

    break ラベルのサンプルコードがあったため動かしてみたところ 予想に反した結果になりましたので質問させてください。 下記、サンプルを動かしたところ 1*1=1 1*2=2 1*3=3 1*4=4 2*1=2 2*2=4 2*3=6 2*4=8 3*1=3 3*2=6 3*3=9 というふうに表示されました。 3*3の次は i=4 で 4*1=4 と表示されると想定していました。 なぜi=4にならないのでしょうか。 public class BreadTest { public static void main(String args[]){ outside: for (int i = 1; i < 5; i++){ for (int j = 1; j < 5; j++){ if (i * j > 10){ break outside; } System.out.println(i + "*" + j + "=" + (i * j)); } } } }

    • ベストアンサー
    • Java
  • forループに慣れるには

    初めまして。 今資格を取ろうと思い独学でJavaを勉強してるんですが、 つまらない部分でつまずいています。 それは少々複雑なfor等のループです。 変数を追っていくうちにこんがらがってしまい、 変数の正しい値を見失ってしまいます。 例えば… Loop: for(int i = 0; i<5; i++) { for(int j =0; j<5; j++) { if(i==j) continue Loop; System.out.println("i = " +i+ "j = " +j); if(i > 3) break Loop; } } や、 int i,j; for(i = 0, j = 0; i<3;) { if(i++ == 2 || j++ == 2) break; } System.out.println(i); System.out.println(j); の様なループです。 試験範囲は大方勉強出来てるんですが まぬけな事にループがイマイチ理解出来てなくて(恥) 皆さんはどうやって慣れてこられましたか? つまらない質問ですが何か良いコツやアドバイスがあれば よろしくお願いします。

  • for文の実行結果について

    public class Trace3 { public static void main(String[] args) { for (int i = 1; i < 4; i++) { for (int j = 1; j <= i; j++) { System.out.print(" " + (i * j)); } System.out.println(); } } } 実行結果は 1 2 4 3 6 9 になります。 i < 4でiは4より小さいで123は解るのですが、 j <= iでjはiより小さくjを含むで何故469になるのですか?

    • ベストアンサー
    • Java
  • ファイルへの出力

    例えば、以下のようなプログラムがあります。 public class rei{ public static void main(String args[]){ for(int i=0;i<100;i++){ System.out.println(i); } } } ここで、iの値をエクセルファイルに出力することはできるのでしょうか?できれば具体的に教えてください。よろしくお願いします。

  • 九九の表

    を作るプログラムなんですが結果がずれて表示されるんですがどうせればきれいにそろうんでしょうか?? いくらやっても上手くいきません・・・。 どなたかヒントもらえませんか。 \tを試して一応そろったんですがもっとコンパクトな表示結果にしたいんです。 プログラムはこんな感じです。 public class Kukuhyou3 { public static void main(String[ ] args) { int i,j,kekka; System.out.println(" | 1 2 3 4 5 6 7 8 9"); System.out.println("--+----------------------------"); for(i = 1;i < 10;i++) { System.out.print( " "+ i +"|"); for(j=1; j < 10; j++) { kekka=i * j; System.out.print(" "+kekka); } System.out.println(""); } } }

    • ベストアンサー
    • Java

専門家に質問してみよう