アプリ版:「スタンプのみでお礼する」機能のリリースについて

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

A 回答 (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);

このときは、定義された階層以下のブロック内で初期化されているので、コンパイラはループの外では定義されていないかもしれない危険性を鑑み、コンパイルエラーを出します。ブロック内というのは、実行時の状況によっては制御が移らないかもしれないので、コンパイル時には別個のものとして解析されているのです。


うまく説明できませんが、これで分かるでしょうか?
    • good
    • 0

変数j, kは,


i によるfor ループのブロックの中で宣言されたローカル変数なので,
そのブロックの外からは参照できません.
(C だったらこうだと思うんですが,Javaでもそうではないですか?)

上が正しいなら,
public... の直後で i,j,k を宣言してしまえば
うまくいくような気がします.
    • good
    • 0

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!