Java道|複数条件の分岐(if~else if~else)

条件が増えても、上から順に見れば迷わない。
if~else if~else を使うと、複数の分岐をすっきり整理できる。

これまでに、if文では「条件が true のときだけ処理を実行する」方法を学びました。
また、if~else文では「true の場合」と「false の場合」の2通りに処理を分けられるようになりました。

ただ、実際のプログラムでは、2通りだけでは足りないことがよくあります。

たとえば、入力された値が 1 なら朝の案内、2 なら昼の案内、それ以外なら入力し直しの案内を表示する、といった場面です。
また、点数が80点以上なら高評価、60点以上なら合格、それ以外なら復習、といったように、複数の条件を順番に調べたい場合もあります。

このようなときに使うのが、if~else if~else です。

if~else if~else を使うと、複数の条件を上から順に判定し、最初に true になった処理だけを実行できます。この記事では、指定内容に沿って Sample4.java のみを使い、複数条件の分岐を鬼滅の刃風の世界観にたとえながら整理します。

鬼滅の刃風にたとえると、if~else if~else は、戦場で任務札を順番に確認していくようなものです。
一番目の条件に当てはまれば、その指令を実行します。
当てはまらなければ次の札を確認します。
それでも当てはまらなければ、最後の通常指令へ進みます。

つまり、複数の分かれ道を上から順に確認し、最初に合った道だけを進むのが if~else if~else です。

if~else if~else とは何か

if~else if~else は、複数の条件を順番に調べて、最初に当てはまった処理を実行する構文です。

基本の形は次のようになります。

if(条件1){
    文1;
}
else if(条件2){
    文2;
}
else if(条件3){
    文3;
}
else{
    文4;
}

↓クリックすると拡大表示されます。

この構文では、まず 条件1 を調べます。

条件1 が true なら、文1 を実行します。
そして、その時点で分岐は終了します。
下にある else if や else は実行されません。

条件1 が false なら、次に 条件2 を調べます。
条件2 が true なら、文2 を実行して分岐は終了します。

条件2 も false なら、次の 条件3 を調べます。
条件3 が true なら、文3 を実行します。

そして、どの条件にも当てはまらなかった場合は、最後の else が実行されます。

判定の順番条件結果
1条件1true なら文1を実行して終了
2条件2条件1が false のときだけ調べる
3条件3条件2も false のときだけ調べる
最後elseどの条件にも当てはまらないときに実行

ここで大切なのは、上から順番に調べて、最初に true になったところだけが実行されるということです。

鬼滅の刃風にたとえると、戦場で指令札を上から順に確認するイメージです。
最初の札が条件に合えば、その指令を実行して終了します。
最初の札が合わなければ、次の札へ進みます。

日常の判断に置きかえる

if~else if~else の考え方は、日常の判断でもよくあります。

たとえば、成績によって行動を変える場合です。

if(成績がとてもよい){
    ごほうびを用意する;
}
else if(合格している){
    ほっとひと安心する;
}
else{
    復習をがんばる;
}

この流れでは、まず「成績がとてもよいか」を調べます。
それが true なら、ごほうびを用意します。

false なら、次に「合格しているか」を調べます。
合格していれば、ほっとひと安心します。

どちらにも当てはまらなければ、復習をがんばります。

状況実行される処理
成績がとてもよいごほうびを用意する
とてもよいほどではないが合格ほっとひと安心する
どちらでもない復習をがんばる

このように、複数の条件を順に確認しながら、その状況に合った処理を選べるのが if~else if~else です。

鬼滅の刃風にたとえると、戦場で次のように判断するイメージです。

状況行動
敵が強力な鬼である特別指令を発動する
通常の鬼である通常指令を発動する
敵を確認できない周囲を警戒する

複数の状況に応じて、処理を分けられるわけです。

処理の流れをつかむ

if~else if~else の流れは、次のように整理できます。

順番動き
1最初の条件を調べる
2true なら、そのブロックを実行して終了
3false なら、次の else if の条件を調べる
4その条件が true なら、そのブロックを実行して終了
5どの条件も false なら、else を実行する

大切なのは、条件を1つずつ上から確認していくことです。

そして、最初に true になったブロックだけが実行されます。
それより下の条件は調べられません。

if(条件1){
    文1;
}
else if(条件2){
    文2;
}
else{
    文3;
}

この場合、条件1 が true なら 文1 だけが実行されます。
条件2 や else は実行されません。

条件1 が false で、条件2 が true なら 文2 だけが実行されます。
else は実行されません。

条件1 も条件2 も false なら、else の 文3 が実行されます。

図:if~else if~else は上から順に判定する

↓クリックすると拡大表示されます。

この図が示していること

この図では、if~else if~else が条件を上から順に調べる流れを示しています。

まず num == 1 を確認します。
true なら おはようございます。 を表示して、分岐はそこで終わります。

num == 1 が false の場合だけ、次に num == 2 を確認します。
num == 2 が true なら こんにちは。 を表示します。

num == 1 も num == 2 も false の場合は、最後の else に進み、1か2を入力してください。 を表示します。

ここから分かることは、if~else if~else では、上から順番に条件を調べ、最初に true になった場所だけが実行されるということです。

else if はいくつでも増やせる

if~else if~else の便利なところは、else if を必要なだけ追加できることです。

条件が2つだけでなく、3つ、4つ、5つと増えても、上から順に並べて書けます。

if(条件1){
    文1;
}
else if(条件2){
    文2;
}
else if(条件3){
    文3;
}
else if(条件4){
    文4;
}
else{
    文5;
}

このように、条件の数に合わせて else if を追加できます。

分岐の数向いている書き方
1つの条件だけif文
true / false の2通りif~else文
3通り以上if~else if~else

ただし、条件が多くなるほど、順番が大切になります。
上にある条件から先に調べられ、true になった時点で下の条件は調べられないからです。

最後の else は省略できる

if~else if~else では、最後の else は必ず書かなければならないわけではありません。

必要がなければ、省略できます。

if(条件1){
    文1;
}
else if(条件2){
    文2;
}

この場合、条件1 も 条件2 も false だったときは、何も実行されずに次の処理へ進みます。

書き方どの条件にも当てはまらない場合
else ありelse の処理を実行する
else なし何も実行せず次へ進む

else は、「どの条件にも当てはまらなかったときの処理」を書きたい場合に使います。

鬼滅の刃風にたとえると、else は「どの指令札にも当てはまらなかったときの通常対応」です。
特別任務でも昼任務でもないなら、通常案内を表示するような役割です。

複数条件の分岐を確認する

ここでは、入力された整数によって、表示するメッセージを変えるプログラムを見ていきます。

1 が入力されたら朝のあいさつ、2 が入力されたら昼のあいさつ、それ以外なら入力案内を表示します。

ファイル名:Sample4.java

import java.io.*;

class Sample4
{
    public static void main(String[] args) throws IOException
    {
        System.out.println("任務番号を入力してください。");

        BufferedReader br =
            new BufferedReader(new InputStreamReader(System.in));

        String str = br.readLine();
        int num = Integer.parseInt(str);

        if(num == 1){
            System.out.println("朝の任務です。おはようございます。");
        }
        else if(num == 2){
            System.out.println("昼の任務です。こんにちは。");
        }
        else{
            System.out.println("1か2の任務番号を入力してください。");
        }
    }
}

このプログラムでは、入力された値に応じて表示が変わります。

入力値表示される内容
1朝の任務です。おはようございます。
2昼の任務です。こんにちは。
それ以外1か2の任務番号を入力してください。

鬼滅の刃風にたとえると、任務番号 1 は朝の巡回任務、任務番号 2 は昼の警戒任務、それ以外は正しい任務番号を案内する流れです。

Sample4.javaの処理の流れ

Sample4.java の処理は、次のように進みます。

順番処理内容
1入力をうながすメッセージを表示する
2キーボードから文字列を読み取る
3入力された文字列を整数に変換する
4num == 1 を調べる
5num == 1 が false なら num == 2 を調べる
6どちらも false なら else の処理を行う

注目したいのは、条件を上から順に確認していることです。

if(num == 1){
    System.out.println("朝の任務です。おはようございます。");
}
else if(num == 2){
    System.out.println("昼の任務です。こんにちは。");
}
else{
    System.out.println("1か2の任務番号を入力してください。");
}

まず num == 1 を調べます。
これが true なら、朝の任務メッセージを表示して分岐は終了します。

num == 1 が false の場合だけ、num == 2 を調べます。
これが true なら、昼の任務メッセージを表示します。

どちらにも当てはまらない場合は、else が実行されます。

1を入力した場合

1 を入力した場合、最初の条件 num == 1 が true になります。

実行例は次のようになります。

任務番号を入力してください。
1
朝の任務です。おはようございます。

この場合、最初の if ブロックが実行されます。

入力値num == 1num == 2実行される処理
1true調べない朝の任務です。おはようございます。

ここで大切なのは、num == 1 が true になった時点で、下の else if や else は実行されないことです。

つまり、num == 2 は調べられません。
最初に true になったところだけが実行されます。

2を入力した場合

2 を入力した場合、最初の条件 num == 1 は false になります。

そのため、次の else if に進みます。

else if(num == 2){
    System.out.println("昼の任務です。こんにちは。");
}

ここで num == 2 が true になるので、昼の任務メッセージが表示されます。

実行例は次のようになります。

任務番号を入力してください。
2
昼の任務です。こんにちは。
入力値num == 1num == 2実行される処理
2falsetrue昼の任務です。こんにちは。

このように、最初の条件が false でも、次の条件が true なら、その場所で処理が決まります。

それ以外を入力した場合

5 を入力した場合を考えます。

この場合、

num == 1

は false です。

さらに、

num == 2

も false です。

そのため、最後の else が実行されます。

実行例は次のようになります。

任務番号を入力してください。
5
1か2の任務番号を入力してください。
入力値num == 1num == 2実行される処理
5falsefalse1か2の任務番号を入力してください。

else は、どの条件にも当てはまらなかった場合の受け皿です。

どこが実行されるのかを整理する

Sample4.java の動きを表にまとめると、次のようになります。

入力値num == 1num == 2実行される処理
1true調べない朝の任務です。おはようございます。
2falsetrue昼の任務です。こんにちは。
5falsefalse1か2の任務番号を入力してください。

ここで注目したいのは、1つの分岐で実行されるのは1か所だけということです。

たとえば、1 を入力した場合は、最初の条件 num == 1 が true になります。
その時点で処理が決まるため、下の else if や else は調べられません。

if~else if~else は、上から順番に条件を調べ、最初に true になったブロックだけを実行します。

図:Sample4.javaの分岐の流れ

↓クリックすると拡大表示されます。

この図が示していること

この図では、Sample4.java の条件分岐の流れを示しています。

まず、入力された num を確認します。
num == 1 が true なら、朝の任務です。おはようございます。 を表示します。

num == 1 が false の場合だけ、次の num == 2 を確認します。
num == 2 が true なら、昼の任務です。こんにちは。 を表示します。

num == 1 も num == 2 も false の場合は、else に進み、1か2の任務番号を入力してください。 を表示します。

ここから分かることは、if~else if~else は条件を段階的に確認し、当てはまった1か所だけを実行する構文だということです。

条件の順番が大切

if~else if~else を使うときに、特に大切なのが条件の順番です。

なぜなら、上にある条件から先に調べられ、true になった時点で分岐が終わるからです。

たとえば、点数で判定する場合を考えます。

if(score >= 60){
    System.out.println("合格です。");
}
else if(score >= 80){
    System.out.println("とてもよくできました。");
}

この書き方には問題があります。

なぜなら、80点以上の人も score >= 60 に当てはまるからです。

たとえば、score が 90 の場合、

score >= 60

は true になります。
その時点で if ブロックが実行され、分岐は終了します。

そのため、下にある score >= 80 は調べられません。

scorescore >= 60score >= 80表示
90true調べない合格です。

本当は 80点以上なら「とてもよくできました。」と表示したいのに、先に score >= 60 が true になってしまうため、期待した結果になりません。

このような場合は、より厳しい条件を先に書きます。

if(score >= 80){
    System.out.println("とてもよくできました。");
}
else if(score >= 60){
    System.out.println("合格です。");
}

この順番なら、80点以上を先に判定できます。

scorescore >= 80score >= 60表示
90true調べないとてもよくできました。
70falsetrue合格です。
40falsefalseどちらにも当てはまらない

if~else if~else では、条件を書く順番が結果に大きく影響します。

鬼滅の刃風にたとえると、強い鬼への特別対応を先に確認せず、通常対応を先にしてしまうと、本来の特別指令が発動しないようなものです。
重要な条件、狭い条件、厳しい条件を先に書くことが大切です。

if~else文との違い

if~else if~else は、if~else文 をさらに発展させた構文です。

構文分岐の特徴
if文条件が true のときだけ処理する
if~else文true と false の2通りに分ける
if~else if~else3通り以上の条件分岐ができる

2通りの分岐なら、if~else文で十分です。

たとえば、num が 5 か、それ以外かを分けるだけなら if~else文で書けます。

しかし、1 の場合、2 の場合、3 の場合、それ以外、というように分岐が増えるなら、if~else if~else が便利です。

条件の数使いやすい構文
1つif文
2通りif~else文
3通り以上if~else if~else

複数の選択肢を順番に調べたいとき、if~else if~else はとても役立ちます。

読みやすい書き方を心がける

条件が増えると、コードはどうしても長くなりやすいです。

そのため、ブロックの { } とインデントを丁寧に書くことが大切です。

if(num == 1){
    System.out.println("朝の任務です。おはようございます。");
}
else if(num == 2){
    System.out.println("昼の任務です。こんにちは。");
}
else{
    System.out.println("1か2の任務番号を入力してください。");
}

このように書くと、どこが if で、どこが else if で、どこが else なのかが分かりやすくなります。

書き方のポイント理由
{ } を使う処理の範囲が明確になる
インデントをそろえる分岐の構造が読みやすくなる
条件を上から自然な順番で並べる判定の流れを追いやすくなる
else を必要に応じて書くどれにも当てはまらない場合を扱える

インデントには文法上の意味はありません。
しかし、コードを読む人にとってはとても大切です。

特に条件分岐では、少し見た目が崩れるだけで、処理の範囲を誤解しやすくなります。

if~else if~else を読むときのポイント

if~else if~else を読むときは、次の順番で確認すると分かりやすくなります。

確認すること見る場所
最初に調べる条件if の条件
次に調べる条件else if の条件
どれにも当てはまらない場合else
実行される処理true になったブロック
条件の順番上から順に自然かどうか

たとえば、次のコードを見るときは、

if(num == 1){
    System.out.println("朝の任務です。おはようございます。");
}
else if(num == 2){
    System.out.println("昼の任務です。こんにちは。");
}
else{
    System.out.println("1か2の任務番号を入力してください。");
}

まず、num == 1 を見ます。
次に、num == 2 を見ます。
最後に、どちらにも当てはまらない場合の else を見ます。

このように上から順に読むと、処理の流れをつかみやすくなります。

if~else if~else を理解するための重要ポイント

if~else if~else を学ぶときは、次の点を押さえておくと安心です。

ポイント内容
複数の条件を順番に判定できるelse if を使って条件を増やせる
最初に true になった場所だけが実行されるその下の条件は調べられない
1つの分岐で実行されるのは1か所だけ複数のブロックが同時に実行されるわけではない
最後の else は受け皿になるどの条件にも当てはまらない場合を扱える
最後の else は省略できる不要なら書かなくてもよい
条件の順番が大切上から順に評価されるため
3通り以上の分岐に向いている複数の選択肢を整理しやすい

この中でも特に重要なのは、最初に true になった場所だけが実行されるという点です。

if(条件1){
    文1;
}
else if(条件2){
    文2;
}
else{
    文3;
}

条件1 が true なら 文1 だけが実行されます。
条件2 や else は実行されません。

条件1 が false で、条件2 が true なら 文2 だけが実行されます。

条件1 も条件2 も false なら、else の 文3 が実行されます。

複数条件の分岐を整理できる便利な構文

if~else if~else は、複数の条件に応じて処理を切り替えるための便利な構文です。

入力値、点数、状態、選択肢などによって、3通り以上の分岐が必要になる場面はよくあります。

場面分岐の例
入力値1なら朝、2なら昼、それ以外なら案内
点数80点以上、60点以上、それ以外
状態攻撃、防御、待機
選択肢メニュー1、メニュー2、その他
任務番号特別任務、通常任務、入力案内

鬼滅の刃風にたとえると、if~else if~else は、戦場で状況を順番に確認し、その状況に合った指令を1つだけ選ぶための構文です。

敵の種類、任務番号、隊士の状態など、判断材料が増えても、上から順に条件を並べることで、処理を整理できます。

複雑に見える条件分岐も、次の考え方を持っておくと読みやすくなります。

読み方内容
上から順に見るJavaは上から条件を調べる
true になったら止まるそのブロックだけを実行する
当てはまらなければ次へ進むfalse なら次の else if へ進む
最後は else が受けるどれにも当てはまらない場合を処理する

この流れを押さえておくと、if~else if~else の分岐はかなり読みやすくなります。