[解決済み] Javaでの無限ループ
質問
次の無限大を見よ。
while
ループを見てください。これは、その下のステートメントに対してコンパイルタイムエラーを引き起こします。
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
が真であるにもかかわらず、コンパイラはまったく文句を言いません。なぜでしょうか?
編集する。
以下のバージョンの
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
ブロック自体の中で
どのように解決するのですか?
コンパイラは、簡単かつ明確に、最初の式 は常に が無限ループになることを証明できますが、2番目の式はそう簡単ではありません。おもちゃのような例では簡単ですが、もしそうならどうでしょう。
- 変数のコンテンツがファイルから読み込まれた場合?
- 変数はローカルではなく、他のスレッドによって変更される可能性がありますか?
- 変数はユーザーの入力に依存していましたか?
コンパイラは明らかにあなたのような単純なケースをチェックしていません。なぜでしょうか?なぜならそれは はるかに難しい であり、仕様で禁止されているからです。参照 セクション14.21 :
(ちなみに、私のコンパイラ
は
という変数が宣言されていると文句を言います。
final
.)
関連
-
Server Tomcat v9.0 Server at localhost の起動に失敗しました。
-
代入の左辺は変数でなければならない 解答
-
[解決済み] JavaでInputStreamを読み込んでStringに変換するにはどうすればよいですか?
-
[解決済み] JavaでNullPointerExceptionを回避する方法
-
[解決済み] JavaにおけるHashMapとHashtableの違いは何ですか?
-
[解決済み] Java Mapの各エントリを効率的に反復処理するには?
-
[解決済み] Javaでメモリーリークを発生させるにはどうしたらいいですか?
-
[解決済み] JavaでArrayListではなくLinkedListを使用するのはいつですか?
-
[解決済み] JavaでStringをintに変換するにはどうしたらいいですか?
-
[解決済み] Javaでネストされたループから抜け出すには?
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
実行中にEclipseがポップアップする A Java Exception has occurred
-
プロジェクトの依存関係を解決できない。
-
ApplicationContextの起動エラーです。条件レポートを表示するには、アプリケーションを'de'で再実行します。
-
強制型変換について
-
List list = new ArrayList(); Error: ArrayList は型に解決できません。
-
アノテーション「@Retention」の役割
-
Javaがリソースリークに遭遇した:'input'が閉じない 解決方法
-
eclipse にリソースリーク:'in' が閉じない
-
ecplise プロンプトが表示されます。"選択したものは起動できません。" "最近の起動はありません。"
-
git pull appears現在のブランチに対するトラッキング情報がありません。