DEV Community

TANIAOKA, Akihiro
TANIAOKA, Akihiro

Posted on

4章3

解説書の内容に沿ってコードにコメントアウトを加えると以下のようになります。

1. public class Main { // クラスMainの宣言
2.   public static void main(String[] args) { // mainメソッドの宣言
3.     int a = 0; // 変数aを0で初期化
4.     while (a < 5) // aが5未満の間、以下のdo-whileループを実行
5.     do {
6.       a++; // aの値を1増加
7.       System.out.print(a); // 現在のaの値を出力
// 正しいdo-whileループの場合、ここにwhile文が続き、セミコロンで終了します。
// しかし、このコードではwhileループを正しく閉じず、無限ループの終了条件にセミコロンが置かれています。
// これにより、コンパイラはdoブロックに対応するwhileブロックを見つけられず、コンパイルエラーが発生します。
8.       while (true); // 正しくない位置にあるセミコロンによりコンパイルエラーが発生
9.     }
10.  } // mainメソッドの終了
11.} // クラスMainの終了
Enter fullscreen mode Exit fullscreen mode

ここで、while (true);の行は無限ループを意図していますが、doループの終わりを示すwhile文が不足しているため、実際には構文エラーを引き起こしています。正しいdo-whileループの書き方はdo { /* 処理 */ } while (条件);となりますが、このコードにはそれがありません。また、セミコロンだけのwhile (true);は、意図したwhileループの構造を持たず、代わりに単独の無限ループとして扱われ、後続のコードと矛盾するためエラーになります。

追記

コンパイルエラーを避けるためには、do-whileループの構文を正しく修正する必要があります。以下のコードは修正されたバージョンです。

1. public class Main { // クラスMainの宣言
2.   public static void main(String[] args) { // mainメソッドの宣言
3.     int a = 0; // 変数aを0で初期化
4.     while (a < 5) { // aが5未満の間、以下の処理を実行
5.       do {
6.         a++; // aの値を1増加
7.         System.out.print(a); // 現在のaの値を出力
8.       } while (false); // do-whileループを閉じる。この例では一回の繰り返し後に終了する。
9.     }
10.  } // mainメソッドの終了
11.} // クラスMainの終了
Enter fullscreen mode Exit fullscreen mode

このコードでは、do-whileループが正しく閉じられていて、while (false)とすることで一回実行した後にループから抜け出します。これは一般的な慣習ではありませんが、while (true);が意図されていた無限ループを避けるための修正例です。

ただし、元のコードの意図が不明なため、この修正は構文的なエラーを解決するだけであり、元のコードの意図した動作を正確に再現しているとは限りません。もしdo-whileループが意図していない場合は、その部分を完全に削除することも選択肢です。もし内部の無限ループが本当に意図されていた場合は、その構造を再考する必要があります。

Top comments (0)