こんにちは!フリーランスの桃太郎です。
Javaのswitch文でString型の文字列を使いたい場面が少なからずあります。
そのようなとき、ふと使い方が合っているか不安に感じたことはないですか?
その不安を解決するのが本記事です。
この記事では、
・そもそもswitchとは
・Javaのswitch文でString型の文字列で条件分岐
という基本的な内容から、
・Java6以前でEnumを使って文字列を扱う方法
・switchでexceptionが発生!!その原因と対策
などの実際の開発現場で直面しそうな問題に関しても解説していきます。
switch文のString型文字列の対応について正しく理解し、必要な場面で使いこなすことができるように、わかりやすく解説します!
なお、Javaの記事については、こちらにまとめています。
そもそもswitchとは
解説を進めていく前に、もしあなたがswitch文の基本的な内容がそもそも分からないという状態であれば、まずは以下の記事を参考にしてみて下さいね。
そうすることで本記事をよりスムーズに読むことができ、あなたの頭の中のモヤモヤがよりスッキリしているはずです。
[頭の中をスッキリしたい方はこちら!]
Javaのswitch文でString型の文字列で条件分岐
switch文そのものに対する準備はバッチリですね。
では、改めてswitch文でString型の文字列を扱い条件分岐させる方法について解説していきます。
Java7からswitch文がString型の文字列に対応しています。
Java6以前ではswitch文の式にString型の文字列は使えませんでした。
参考までにswitch文で使える型は、int、short、char、byte、enum、Stringです。
また条件分岐が多い処理の場合、if文よりもswitch文の方がパフォーマンスが良いとされています。
そして、switch文の文字列の比較にはequalsメソッドが内部で使われています。
そのため、equalsメソッドと同じように比較する文字列の大/小文字が区別されるので、その点は注意しましょう。
では具体的なサンプルをみていくことしましょう。
public class Main { public static void main(String[] args) throws Exception { // 好きな色による性格判断 String answer = "青色"; switch (answer) { case "赤色": System.out.println(answer + ":" + "情熱的なリーダタイプ"); break; case "黄色": System.out.println(answer + ":" + "食いしん坊な和ませタイプ"); break; case "青色": System.out.println(answer + ":" + "沈着冷静な参謀タイプ"); break; case "紫色": System.out.println(answer + ":" + "少し斜めに構えた孤独タイプ"); break; case "白色": System.out.println(answer + ":" + "正義感が強い率先タイプ"); break; case "黒色": System.out.println(answer + ":" + "あえて悪をも受け入れる懐の広いタイプ"); break; default: System.out.println(answer + ":" + "選ぶことができない優柔不断タイプ"); } } }
実行結果
青色:沈着冷静な参謀タイプ
上記の通り、swtich(変数)の変数箇所にString型の文字列を入れて条件分岐できることが確認できました。
そして先ほど条件分岐が多い場合はif文よりもswitch文の方がパフォーマンスが良いことを伝えましたが、さらにもう一つswitch文のメリットがあります。
そのメリットとは実装ミスが起こりにくいことです。
どういうことかと言いますと、switch文ではcaseに指定する値が重複しているとコンパイルエラーが発生します。
つまり、条件分岐の選択肢が多い場合に、プログラマーが選択肢を書き間違えたことに気が付く仕組みがif文には無く、switch文には有るということです。
上記の処理をif文で書いた際に、以下のような書き方をしてもコンパイルエラーで検知してもらえないということです。
public class Main { public static void main(String[] args) throws Exception { // 好きな色による性格判断 String answer = "青色"; if(answer.equals("赤色")){ System.out.println(answer + ":" + "情熱的なリーダタイプ"); }else if(answer.equals("青色")){ System.out.println(answer + ":" + "食いしん坊な和ませタイプ"); }else if(answer.equals("青色")){ System.out.println(answer + ":" + "沈着冷静な参謀タイプ"); } } }
実行結果
//キャラが崩壊、、 青色:食いしん坊な和ませタイプ
ということで、条件分岐が多い時はswitch文を利用することをオススメします!
Java6以前でEnumを使って文字列を扱う方法
Java6以前の環境で文字列をswitch文で比較するには、Enumを使う方法があります。
詳しい方法はこちらの記事で確認してください!
これまで解説してきた通り、最新のJavaバージョンではswitch文にて条件分岐に文字列を指定できますが、Java6以前はコンパイルエラーとなります。
その為、Java6以前のバージョンを利用している環境ではEnumを利用して擬似的に文字列分岐を行います。
switchでexceptionが発生!!その原因と対策
以前に筆者が実際に直面したバグに、このようなことがありました。
有るサイトへの流入経路(ユーザがどのページから自前のページに入ってきたか)を調べるために、リファラー(ページ遷移元の情報)を取得し処理する実装を行いました。
リファラーは通常であれば何がしかの値が入っています。
ですが、例えば自前のページをブックマークとしてお気に入り追加をしていて、数日後にブックマークから自前のページに遷移してきた場合は、リファラーがnullとなる場合があります。
そこを考慮せずにswitch文で以下のような処理を実装すると実行時にNullPointerExceptionが発生します。
public class Main { public static void main(String[] args) throws Exception { String referrer = getReferrer(); switch (referrer) { //ここで実行時エラー発生 case "https://www.google.co.jp/": System.out.println("グーグルから遷移"); break; case "https://www.bing.com/": System.out.println("bingから遷移"); break; default: System.out.println("そのほかの検索エンジンから遷移"); } } /*遷移元のURLを取得する処理*/ private static String getReferrer(){ String ref = ""; /* ここにリファラー取得処理 */ //上記の処理の結果でnullが得られたと仮定 ref = null; return ref; } }
実行結果
Exception in thread "main" java.lang.NullPointerException at Main.main(Main.java:9)
このような場合、switch文の前にnullチェックを入れ、nullの場合は分岐させたい文字列に変換しておくということが対策として有効です。
String referrer = getReferrer(); //nullチェック if(referrer == null){ referrer = "その他"; } switch (referrer) { case "https://www.google.co.jp/": System.out.println("グーグルから遷移"); break; case "https://www.bing.com/": System.out.println("bingから遷移"); break; default: System.out.println("そのほかの検索エンジンから遷移"); }
switch文で例外が発生した際には、上記のような原因や対策が実施されているかどうかチェックしてみて下さいね。
まとめ
いかがでしたか?
今回はswitch文でString型の文字列を使う方法について解説しました。
文字列がnullの場合は例外が発生するので注意してくださいね。
もしswitch文の文字列の扱い方について忘れてしまったらこの記事を確認してください!