Java 広告

【Java】【基礎編】あまりやって欲しくないループ文の書き方(while(true)、for( ; ; ))

記事内に商品プロモーションを含む場合があります

Javaでループ文を実装する方法としてfor、while、do~whileなどの書き方がありますが、今回はあまり良くない書き方を紹介します。

どちらもループ文の終了条件が、ループ文内を読まないと分からず、下手に使うと無限ループにはまる恐れがあり、プログラムの読みにくさ、バグの見つけにくさの観点から個人的に推奨する書き方とは言えません。

ここで紹介する書き方は絶対に使わないように普段からコードを書くのを心掛けて下さい。

①while(true)

まず最初に紹介するのはwhile文の継続条件にtrueを入れる書き方です。

例えば、以下のように書きます。

		//合計
        int sum = 0;
        //加算する数
        int i = 1;
        //1~100までを合計する
        while(true) {
        	sum = sum + i;
        	i++;
        	if(i > 100) break;
        }
        //結果をコンソールに表示
        System.out.print(sum);

上記の簡素なコードでもループの終了条件をwhile文の中で見つけないといけません。

例として挙げたコードはwhile文の内容が短いから簡単に終了条件を見つけられますが、実際に開発するコードはwhile文の中で分岐処理を行ったり、さらにループ処理を行ったりすることもあることでしょう。

そのようにwhile文の中で複雑な処理が行われている場合、必ずループが終了するようになっているか、ループの終了条件はどうなっているかを追っていかなければならず、コードを読む時間が余計にかかってしまいます。

そのため、コードの可読性が下がり、保守性も下がってしまうことになります。

C言語系の中ではwhile(1)と書ける言語もありますが、これも「1って何?」と、1がtrueの値であることを理解していないと、読みづらいコードになってしまいます。

ですので、while文を使う時は、以下のようにwhileの継続条件をきちんと明記し、バグが起きないようにしっかりと読みやすいコードを書くように気を付けましょう。

		//合計
        int sum = 0;
        //加算する数
        int i = 1;
        //1~100までを合計する
        while(i <= 100) {
        	sum = sum + i;
        	i++;
        }
        //結果をコンソールに表示
        System.out.print(sum);

②for( ; ; )

2つ目はfor文の中に何も書かないで、顔文字みたいになっている書き方です。

例えば以下のように書きます。

		//合計
        int sum = 0;
        //加算する数
        int i = 1;
        //1~100までを合計する
        for( ; ; ){
        	sum = sum + i;
        	i++;
        	if(i > 100) break;
        }
        //結果をコンソールに表示
        System.out.print(sum);

これは、開始条件、終了条件、for文を繰り返した際の変数の加減算を省略した書き方となり、while(true)と同じように、終了条件をループ文内を追っていかないといけません。

注意したいことはwhile(true)と全く同じで、コードの可読性の低下と、保守性の低下が懸念されます。

この書き方をしているコードを見たことが実際にあるのですが、折角for文を使っているのになぜ無限ループになるような書き方をしているかの意図が全く理解できませんでした。

そのため、無限ループを実現するためにfor文を使うことは個人的に推奨しません。

そもそも無限ループになるコードを書いてはいけないということは前提であり、そのリスクを極限に下げるために、繰り返し処理やループ処理では終了条件を明示するという書き方の癖をつけることを意識しなければなりません。

ちなみに、例で挙げたコードは以下のように書けば済む話です。

		//合計
        int sum = 0;
        //加算する数
        int i = 1;
        //1~100までを合計する
        for(i = 1; i <= 100 ; i++){
        	sum = sum + i;
        }
        //結果をコンソールに表示
        System.out.print(sum);

これをわざわざfor(;;)を使って書くメリットはありません。

まとめ

今回はあまりやって欲しくないループ文の書き方として以下の2つを紹介しました。

  1. while(true)
  2. for(;;)

どちらも自分が実際に見たことがあるループの書き方ですが、基本的にプログラムというのは有限時間で処理が完了するコードを書かなければなりません。

しかし、上記2つの書き方はどのルートを通ってもループ文が終了するように注意を払う必要があり、注意を怠ると無限ループで処理が終了しないことになります。

可読性も落ちるし、保守性も落ちる、そうであれば最初からこの書き方を使わなければいいだけです。

この書き方を知っていて偉いと思って使う人が居るかもしれませんが、それはコードを書く人のエゴでしかありません。

誰もが読みやすい、保守をしやすいというのが、良いコードであると個人的に考えています。

今回の記事はここまでとなります。
また次の記事でお会いしましょう。