Help us understand the problem. What is going on with this article?

Javaのお勉強 ~その11~ switch文

More than 1 year has passed since last update.

1. はじめに

今回はー、if文に似た条件分岐に関してです!

その名は「switch文」!
私個人的には、if文を使うことが多いですが、時々switchを見るので覚えておいて損はなし!

2. switch文

2.1. switch - 基本

switch文も条件式です。
基本系のswitch文は次のような感じ。。

Main.java
public class Main {
    public static void main(String[] args) {

        // ↓switch文 ここから
        switch(){
        case 値_0:
            // 値0についての処理
            break;
        case 値_1:
            // 値1についての処理
            break;
        case 値_2:
            // 値2についての処理
            break;
        }
        // ↑switch文 ここまで
    }
}

式には、基本プリミティブ型が使えます。

しかし、まぁこれだけじゃなんのこっちゃですねw

具体的に値を入れてもう少し理解できるようにしましょう!

Main.java{
public class Main {
    public static void main(String[] args) {

        int number = 1;

        // ↓switch文 ここから
        switch(number){
        case 0:
            // 値0についての処理
            System.out.println("0の表示だもん");
            break;
        case 1:
            // 値1についての処理
            System.out.println("1の表示じゃ");
            break;
        case 2:
            // 値2についての処理
            System.out.println("2の表示!!ウゴゴゴゴゴ");
            break;
        }
        // ↑switch文 ここまで
    }
}

まず、number = 1に初期化していますね!

そして、switch(number)で判定する値を渡してあげます。
この時に渡した number の値がそれぞれ case の右に当てはまるかどうか評価されます。

今回はnumber = 1なので、case 1: 内の処理が実行され、「"1の表示じゃ"」が出力されます。

number の値を0~2に変えてみるのもいい勉強になりますよ。

2.2. switch - break

肝心なことですが、「break;」文というものを書かないと悲惨な目にあいます。
例えば、次の例。。

Main.java
public class Main {
    public static void main(String[] args) {

        int number = 1;

        // ↓switch文 ここから
        switch(number){
        case 0:
            // 値0についての処理
            System.out.println("0の表示だもん");
        case 1:
            // 値1についての処理
            System.out.println("1の表示じゃ");
        case 2:
            // 値2についての処理
            System.out.println("2の表示!!ウゴゴゴゴゴ");
        }
        // ↑switch文 ここまで
    }
}

breakの一言を全部消してみました。
するとどうでしょうか。

case 1:の条件に一致した後に処理を実行したあと、
case 2:の処理も実行されてしまっていることが分かります。

なんじゃこりゃー!ですよ!
ついでに基本である処理が上から下へ流れてしまっているということが分かるw

breakを書かないと次の処理へ移行してしまい、次の case の処理を走らせてしまいます。

必要に応じて「break」忘れないように!!


稀にテクニックとして、

Main.java
public class Main {
    public static void main(String[] args) {

        int number = 1;

        // ↓switch文 ここから
        switch(number){
        case 0:
        case 1:
        case 2:
            // 値0, 1, 2についての処理
            System.out.println("0と1と2の表示だもん");
            break;
        }
        // ↑switch文 ここまで
    }
}

という風にまとめてやってしまうこともできちゃう。

2.3. switch - default

if文ではelseというものが使えましたよね。

このelseの代わり?に使えるのが、defaultというものがあります。
使い方は...

Main.java
public class Main {
    public static void main(String[] args) {

        int number = -1;

        // ↓switch文 ここから
        switch(number){
        case 0:
            // 値0についての処理
            System.out.println("0の表示だもん");
            break;
        case 1:
            // 値1についての処理
            System.out.println("1の表示じゃ");
            break;
        case 2:
            // 値2についての処理
            System.out.println("2の表示!!ウゴゴゴゴゴ");
            break;
        default:
            System.out.println("Yaaaaaaa");
            break;
        }
        // ↑switch文 ここまで
    }
}

肝心は最後の一行。

default:
  System.out.println("Yaaaaaaa");

というところ。ここがif文でいうelseのようなものです。

どの値にも当てはまらなければ default に処理が走るようになっています。

2.4. switch - String 型

少し脱線気味な話になりますが、
Java SE 7から、switch 構文に String 型が使えるようになってます。(豆知識として
先ほどは、switch の式にはプリミティブ型が使えるとお話しましたが、String 型も少し特別に扱えるようになってます!

Main.java
public class Main {
    public static void main(String[] args) {

        String number = "zero";

        // ↓switch文 ここから
        switch(number){
        case "zero":
            // 値 zero についての処理
            System.out.println("0の表示だもん");
            break;
        case "one":
            // 値 first についての処理
            System.out.println("1の表示じゃ");
            break;
        case "two":
            // 値 two についての処理
            System.out.println("2の表示!!ウゴゴゴゴゴ");
            break;
        default:
            System.out.println("Yaaaaaaa");
            break;
        }
        // ↑switch文 ここまで
    }
}

普通に数値の時と同じように使えるようになったわけですね。
ありがたい

ただし!

String 型が「null」という空っぽの状態であった場合、
(number = "", number = "null" などという状態以外で、nullという特別な存在のゴミが入っている状態)
この場合は、defaultで拾ってくれないのでちょっぴり注意!!
例えば下の例。

Main.java
public class Main {
    public static void main(String[] args) {

        String number = null;

        // ↓switch文 ここから
        switch(number){
        case "zero":
            // 値 zero についての処理
            System.out.println("0の表示だもん");
            break;
        case "one":
            // 値 first についての処理
            System.out.println("1の表示じゃ");
            break;
        case "two":
            // 値 two についての処理
            System.out.println("2の表示!!ウゴゴゴゴゴ");
            break;
        default:
            System.out.println("Yaaaaaaa");
            break;
        }
        // ↑switch文 ここまで
    }
}

いきなり宣言している number という String 型に null を入れていますね。

そして、このプログラムを実行すると、switch(number)の行で「NullPointerException」というエラーが出ます。
いわゆる「ぬるぽ」。

ですので、switchを通す場合は前に null かどうかチェックを入れてあげたりするのも得策かと思います。

Main.java
public class Main {
    public static void main(String[] args) {

        String number = null;

        // null チェック
        if(number == null){
            // number が null ならとりあえず空文字列を入れておっく
            number = "";
        }

        // ↓switch文 ここから
        switch(number){
        case "zero":
            // 値 zero についての処理
            System.out.println("0の表示だもん");
            break;
        case "one":
            // 値 first についての処理
            System.out.println("1の表示じゃ");
            break;
        case "two":
            // 値 two についての処理
            System.out.println("2の表示!!ウゴゴゴゴゴ");
            break;
        default:
            System.out.println("Yaaaaaaa");
            break;
        }
        // ↑switch文 ここまで
    }
}

極端かもですが、このようなやりたかもありかもですね。

3. おわりに

今回のまとめとしては、

  • switch は条件式として使える
  • break は必要に応じてしっかり見落とさないように
  • default という if 文でいう else が使える
  • String 型も扱えるが null には少し注意が必要

以上です。

なにか書き忘れてたようなモヤモヤしたものがありますが、、、

次回は「for文」について記事を書きたいと思います!!

少し更新間隔空きそうなので、お待ちくださいーーー

koukonko
プログラミングします Java/PHP/javascript/C#/C++/Python/競プロなどの記事を書きたい
Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away