while
次の Javaの無限ループを見てください。その下のステートメントでコンパイル時エラーが発生します。
while(true) {
System.out.println("inside while");
}
System.out.println("while terminated"); //Unreachable statement - compiler-error.
ただし、次の同じ無限while
ループは正常に機能し、条件をブール変数に置き換えただけのエラーは発生しません。
boolean b=true;
while(b) {
System.out.println("inside while");
}
System.out.println("while terminated"); //No error here.
2番目のケースでも、ブール変数b
がtrueであるため、ループの後のステートメントは明らかに到達できませんが、コンパイラーはまったく文句を言いません。なんで?
編集:の次のバージョンは、明らかなように無限ループに陥りますが、ループ内while
の条件が常にであるにもかかわらず、その下のステートメントに対してコンパイラ エラーを発行しません。コンパイル時そのもの。if
false
while(true) {
if(false) {
break;
}
System.out.println("inside while");
}
System.out.println("while terminated"); //No error here.
while(true) {
if(false) { //if true then also
return; //Replacing return with break fixes the following error.
}
System.out.println("inside while");
}
System.out.println("while terminated"); //Compiler-error - unreachable statement.
while(true) {
if(true) {
System.out.println("inside if");
return;
}
System.out.println("inside while"); //No error here.
}
System.out.println("while terminated"); //Compiler-error - unreachable statement.
編集:if
と同じことwhile
。
if(false) {
System.out.println("inside if"); //No error here.
}
while(false) {
System.out.println("inside while");
// Compiler's complain - unreachable statement.
}
while(true) {
if(true) {
System.out.println("inside if");
break;
}
System.out.println("inside while"); //No error here.
}
次のバージョンのwhile
も無限ループに陥ります。
while(true) {
try {
System.out.println("inside while");
return; //Replacing return with break makes no difference here.
} finally {
continue;
}
}
これは、ステートメントがブロック自体の中でステートメントの前に遭遇しfinally
たとしても、ブロックは常に実行されるためです。return
try