Chapter 10

条件分岐

KeitoYuasa
KeitoYuasa
2023.02.12に更新

if文

  • if(条件){条件がtureの時の処理;}
  • 条件:boolean型になる式にしなければいけない
  • 処理する文が1文の場合、{}を省略することができる

以下では、変数ageの値と20が等しいので、if文の処理が実行される。

Training.java
class Training {
    public static void main(String[] args){
        int age = 20;

        if (age == 20){
            System.out.println("二十歳です。");
        }
    }
}
//出力結果:二十歳です。

※3行目をint age = 18;に変更すると、if文の条件がfalseになるのでif文のブロック内の処理が実行されない。

また、if文ブロック内の処理が1文の場合、{}を省略することができる。

Training.java
class Training {
    public static void main(String[] args){
        int age = 20;

        if (age == 20)
            System.out.println("二十歳です。");
        System.out.println("これは、if文より外です。");
    }
}
//出力結果:二十歳です。
これは、if文より外です。

if~ else文

  • if(条件){条件がtureの時の処理;}else{条件がfalseの時の処理;}
  • 処理する文が1文の場合、{}を省略することができる

以下では、if文の条件がfalseになるので、else文の処理が実行される。

Training.java
class Training {
    public static void main(String[] args){
        int age = 18;

        if (age == 20){
            System.out.println("二十歳です。");
        }else{
            System.out.println("二十歳ではありません。");
        }
    }
}
//出力結果:二十歳ではありません。

if~ else if文

  • if(条件A){条件Aがtureの時の処理;}else if(条件B){条件Bがtureの時の処理;}
  • 条件:boolean型になる式にしなければいけない
  • 処理する文が1文の場合、{}を省略することができる

以下では、if文の条件はfalseになるものの、else if文の条件がtrueになるためelse if文の処理が実行される。

Training.java
class Training {
    public static void main(String[] args){
        int age = 18;

        if (age == 20){
            System.out.println("二十歳です。");
        }else if(age == 18){
            System.out.println("二十歳まで後少しです。");
        }else{
            System.out.println("二十歳ではありません。");
        }
    }
}
//出力結果:二十歳まで後少しです。

三項演算子

  • 条件 ? trueの場合返す ; falseの場合返す;
Training.java
class Training {
    public static void main(String[] args){
        int i = 10;
        String s = "iの値は";
        s += i > 10 ? "10以上" : "10未満";

        System.out.println(s);
    }
}
//出力結果:iの値は10未満

※結果は、記号の優先順位に基づいて出力されている

switch文

if文に比べて、多分岐処理が楽に実装できる。

  • switch(式){case 定数1: 処理1; break; case 定数2: 処理2; default: 処理3;}
  • 式:byte, short, int, char, およびそれらのラッパークラス, String, enumのいずれかの値でないといけない。それ以外の型はコンパイルエラー
  • switchの式とcase 定数を比較してtrueになれば、そのcaseの処理を実行する。(そのため、式と定数のデータ型に注意
  • 判定がtrueとなり、実行されるcaseにbreakがない場合は、判定関係なく次のcaseの処理が実行される。
No. 注意点
1 式は、byte, short, int, char, およびそれらのラッパークラス, String, enumのいずれかの値でないといけない。それ以外の型はコンパイルエラー
2 式がnullの場合、コンパイルは成功するが、実行時にNullPointerExceptionエラーが出力される
3 case, defaultの終わりはコロン
4 break;でswitch文を抜ける
5 caseの処理文の最後にbreak;を指定しない場合、判定に関係なく、次のcaseの処理に移り、処理が実行される。
6 どのcaseにも一致しない場合、またはcaseの処理をbreakで終了しない場合に、default:が実行される。defaultの位置は、switch内のどこに記述しても問題ない。
7 case, defaultの処理は{}が不要
8 default:にbreak;は不要

以下では、switch文の例を示している。
int i = 1;にした場合、default:が実行される。

Training.java
class Training {
    public static void main(String[] args){
        int i = 10;

        switch(i){
            case 0:
              System.out.println("iは、0です。");
              break;
            case 5:
              System.out.println("iは、5です。");
              break;
            case 10:
              System.out.println("iは、10です。");
              break; //breakがなければdefaultに移る
            default:
              System.out.println("iは0, 5, 10ではありません。");
        }
    }
}
//出力結果:iは、10です。

※case 10:の実行処理にbreak;がないと、default:も実行する。
defaultは、どのcaseに当てはまらない場合に実行されるが、breakがない場合は、次のcaseに移るため実行されることになる。

以下では、注意点⑤の例を示す。
breakがない場合、caseの判定関係なく、処理が実行されていることがわかる。

Training.java
class Training {
    public static void main(String[] args){
        int[] i_array = {1, 2, 3};
        for(int i : i_array){
          switch(i){
            case 1:
              System.out.println("1");

            case 2:
              System.out.println("2");
              break;

            default:
              System.out.println("Other");
          }
        }
    }
}
//出力結果:
//1
//2
//2
//Other

switch文の式

  • 式は、byte, short, int, char, およびそれらのラッパークラス, String, enumのいずれかの値でないといけない。それ以外の型はコンパイルエラー
  • 式は、算術でも問題ない
  • 式は、変数宣言できない。コンパイルエラーになる。
int i = 2;
switch(i + 10){} //ok
switch(i++){} //ok
switch(int i2 = 10;){} //コンパイルエラー

case 定数:

caseに指定するものは、**定数(= 変わらない数値のこと)でなければいけない。
つまり、定数(final)はok、変数はコンパイルエラーになる。

以下では、case 定数:の例を示す。

  • コンパイルエラーの例として以下を紹介している。
    • ①定数に、変数を指定した場合。
    • ②定数の配列を指定した場合。

②については、配列全体としては、定数として扱われる(つまり、配列自体のメモリアドレスは変えられないということ)が配列の要素自体は変更が可能であるため、コンパイルエラーとなっている。

Training.java
class Training {
    public static void main(String[] args){
        int i = 10;
        final int f_i = 5;
        final String[] f_s = {"a"};

        switch(i){
            case 0:
              System.out.println("iは、0です。");
              break;
            case f_i:
              System.out.println("iは、5です。");
              break;
            case i: //コンパイルエラー
              System.out.println("iは、10です。");
              break;
            case f_s[0]: //コンパイルエラー
              System.out.println("iは、10です。");
              break;
            default:
              System.out.println("iは0, 5, 10ではありません。");
        }
    }
}
//出力結果:コンパイルエラー