なぜコンパイルエラーにならない?

このQ&Aのポイント
  • ある問題集の問題なのですが、ラベルをfor か while以外につけているのでコンパイルエラーになるという問題でした。
  • 確かに、打ち込んでみると、コンパイルエラーになります。しかし、continueをbreakに変更すると、コンパイルエラーにはならないのです。
  • テキストでは、breakであれcontinueであれ、forやwhile以外につけるとコンパイルエラーになると書かれています。
回答を見る
  • ベストアンサー

なぜコンパイルエラーにならない?

flag: for ( int i= 0 ; i<5 ; i++){ for(int j=0 ; j<3 ; j++){ label:  if(i<j){ i++; continue label; } System.out.println("あ"); } } ある問題集の問題なのですが、ラベルをfor かwhile 以外につけているのでコンパイルエラーになるという問題でした。 納得。 確かに、打ち込んでみると、コンパイルエラーになります。 しかし、continue を break に変更すると、コンパイルエラーにはならないのです。 なぜでしょうか。 テキストでは、break であれ continueであれ、for や while 以外につけるとコンパイルエラーになると書かれています。 どなたか、教えていただけますか?

  • Java
  • 回答数3
  • ありがとう数3

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

  • ベストアンサー
回答No.2

言語仕様上そうなっているからです。 continute はループ専用ですが、break はもうちょっと用途が広いという ことみたいですね。 java言語仕様第2版より引用(ちと古いですが最新は英語なので・・・) 14.14 break 文 「ラベル Identifier 付きの break 文は,それを取り囲んでいる, 同じ Identifier をラベルとする,ラベル付き文(14.7)に制御を移そうとする。 この文は break ターゲット(break target)と呼ばれ,直ちに正常完了する。 この場合,break ターゲットは,while,do,for 又は switch 文でなくてもよい。

その他の回答 (2)

回答No.3

No.2 です書き忘れましたが ラベルは任意のステートメントに付けられます。 制限が有るのは continue の方です。

  • OKWavex
  • ベストアンサー率22% (1222/5383)
回答No.1

たんにらべるがせいぎょにつかわれてないからでしょ

関連するQ&A

  • コンパイル後のエラー。

    こんにちは、質問があります。 下のプログラムを組みました。 コンパイルには成功しましたが、実行することができません。 import java.io.*; public class Gyouretu { public static void main(String[] args) { BufferedReader reader = new BufferedReader( new InputStreamReader(System.in), 1); try{ System.out.println("行列数を入力"); String line = reader.readLine(); int n = Integer.parseInt(line); int a[][] = new int[n][n]; int b[][] = new int[n][n]; int c[][] = new int[n][n]; int i,j,k; for ( i = 0; i < n; i++){ for ( j = 0; j < n; j++){ c[i][j]=0; for ( k = 0; k < n; k++){ c[i][j] += a[i][k] * b[k][j]; System.out.print(c); System.out.print(i); System.out.print(j); } } } }catch (IOException e){ System.out.println("end"); } } } 行列の計算をするプログラムなのですが、コンパイル後に行列数(何行何列か?)を入力するとこんなエラーが出ます。 「'2' は、内部コマンドまたは外部コマンド、  操作可能なプログラムまたはバッチ ファイルとして認識されていません。」 なぜなのか、どうしてもわかりません。 よろしくお願いします。

    • ベストアンサー
    • Java
  • 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
  • 配列要素の操作でコンパイルエラーが出ます

    JAVAの勉強中なのですが、テキストの通り入力しているのですがコンパイルエラーが出てしまいます。 public class hairetu{ public static void main(String[] args){ int[] ary = new int[7]; ary[0] =100; ary[1] = 50+31; int x = 9; ary[2] = x; ary[3] = 0; ary[3]++; ary[4] = ary[0]+ ary[1]; int j =5; ary[j] = j*2; for(int i= 0; i < ary.length; i++){ System.out.println("ary["+i+"]="ary[i]); } } } 何がおかしいのでしょうか? System.out.println("ary["+i+"]="ary[i]);の部分で、 ')'がありません。 式の開始が不正です。 ';'がありません と、エラーが出ます。 前回もテキストに説明の無いまま章末問題が出題され、解答を見ても分かりませんでした。 現在使っているテキストが信用出来なくなってきたので、 もしご存知でしたらお勧めのJAVAの入門書も教えて頂けたら幸いです。

    • ベストアンサー
    • Java
  • コンパイルできません

    2から150の中から数字を30個取得する。というのを2回繰り返します。そして、その2回とも両方に現れた数字だけを表示させたいのですが、自分が作成したプログラムではうまくコンパイルできませんでした。シンボルを解釈処理できません。互換性のない型。というエラーが出てしまいます。ここが間違っているなどアドバイス等お願いしますm(_ _)m import java.util.*; public class RandomTest { public static void main(String[] args) { Random generator = new Random(); //2から150の中から値が30個表示される for(int i=0; i<30; i++){ int ran = (int)(Math.random() * 148)+2; } for(int j=0; j<30; j++){ int ran2 = (int)(Math.random() * 148)+2; } int ran3 = ran && ran2; System.out.println(ran3); } }

    • ベストアンサー
    • Java
  • コンパイルできない!助けてください!

    以下のプログラムがコンパイル出来ません。 なぜでしょうか? それと、このプログラムにソート対象の比較回数や書き換え回数を付け加えたいのですが、どうもうまくいきません。 あと、乱数を発生させて実験もしてみたいのですが、うまくいきません。 どうしても、コームソート自体が納得いかず、色々、実験しています。 何か、いい情報があれば、教えていただければありがたいです。 質問が多くてすみません。 よろしくお願いします! #include <stdio.h> #include <time.h> /* * コームソート * */ void comb_sort11 (KEY x[], int n) { int i, gap; KEY hold; enum {BREAK, CONT} flag; gap = n; flag = CONT; while (flag == CONT !! gap > 1) { flag = BREAK; gap gap / 1.3; if (gap == 0) gap = 1 ; else if (gap == 9 !! gap == 10) gap = 11; for (i = 0; i + gap < n; i++) if( x[i] > x[i+gap]) { hold = x[i]; x[i] = x[i+gap]; x[i+gap] = hold; flag = CONT; } } } #include <stdio.h> main() { int s, e; int n=5,i; int x[] = {5,8,3,6,2}; s = clock(); comb_sort11(x,n); e = clock(); for (i = 0; i <= n-1; i++){ printf("%d",x[i]);} fprintf(stderr,"time = %d\n", e - s ); return 0; }

  • コンパイルできません。

    コマンドプロンプト上で、乱数をいくつか取得するというプログラムを作成したいのですが、コンパイル出来なくて困っています。発生させる乱数を0~900までの数字の中から0~9個のうちのいずれかの個数だけ取得するようにしたいです。j< の所に変数を記述するのはダメなのでしょうか?わかる方いましたらお願いします。 import java.util.*; public class RandomTest{ int rand; public static void main(String[] args){    Random generator = new Random();    for(int i=0; i<1; i++){     int rand = (int)(Math.random() * 10);    }    for(int j=0; j<rand; j++){     int ran = (int)(Math.random() * 1000);       System.out.println(ran);    } } }

    • ベストアンサー
    • Java
  • arraycopy コンパイルエラー

    javaの勉強をしているのですが arraycopy()を使ったプログラムでエラーが出てしまいます。 class Ex97{ public static void main(String args[]){ int []a = new int[10]; int []b = new int[5]; for(int i=0; i<10; i++){ a[i] = (int)(Math.random()*10); } System.arraycopy(a, 2, b, 0, 5); for(int i=0; 0<a.length-1; i++){ System.out.println(a[i]); } System.out.println(""); for(int i=0; 0<b.length; i++){ System.out.println(b[i]); } } } /*メッセージ Exception in thread "main" java.lang.ArrayIndexOutOfBoundsException: 10 at Ex32.main(Ex32.java:13) */ このプログラムはaの3番目の要素から5つ分の内容をbへコピーする というものです。 ご回答よろしくお願いします。

    • ベストアンサー
    • Java
  • 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
  • コンパイルエラーについて。

    今晩は。現在javaについて勉強しているのですが、 コンパイルエラーを解決することが出来ません。 プログラムの内容は好きな文字列を入力し、空白文字を取り除き出力するといったものです。 空白はindexOf()メソッドを使って探し出す。 空白削除はdeleteCharAt()メソッドを使って行う。 というのが条件です。 どなたかご回答おまちしております。 class bf2{ public static void main(String args[])throws IOException{ String t = "end"; String str = ""; int l; int i; int xx=0; String kuhaku = " "; BufferedReader br = new BufferedReader(new InputStreamReader(System.in)); while(!str.equals(t)){ System.out.print(">"); str = br.readLine(); if(str.equals(t)) break; l = str.length(); i=0; StringBuffer str2 = new StringBuffer(str); while(i<l){ xx = str2.indexOf(kuhaku); str2.deleteCharAt(xx); //こちらがコンパイルエラー会場です。 i++; System.out.println(str2); } } } } Exception in thread "main" java.lang.StringIndexOutOfBoundsException at java.lang.StringBuffer.deleteCharAt(Unknown Source)

    • ベストアンサー
    • 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); の様なループです。 試験範囲は大方勉強出来てるんですが まぬけな事にループがイマイチ理解出来てなくて(恥) 皆さんはどうやって慣れてこられましたか? つまらない質問ですが何か良いコツやアドバイスがあれば よろしくお願いします。