【2026年7月最新】Java switch-case文の使い方完全ガイド|フォールスルー・switch式・enum実務パターン・Claude Code活用まで
この記事の内容
Javaのコードでswichーcaseを使い始めると「なぜかすべてのcaseが実行される」「enumとどう組み合わせるのか分からない」「Java14以降で新しい書き方があるって聞いたけど何が変わった?」という疑問にぶつかることがあります。
この記事では、Java switch-case文の基本から実務レベルまでを一気に整理します。特に初心者が嵌まりやすい「break省略によるフォールスルー(意図せず全caseが実行されるバグ)」と、Java14で追加された「switch式(->記法)」まで解説します。
01 OVERVIEW switch-case文とは|if-elseとの違いと使い分け 条件分岐の種類とswitch-caseが適切な場面
switch-case文は、一つの変数の値が「何に等しいか」によって処理を分岐させるJavaの制御構文です。「AならX、BならY、CならZ、それ以外ならW」という形の分岐を、if-elseより読みやすく書けます。
📚 用語解説
switch-case文:Javaの制御構文の一つ。switch(式)でカッコ内の値を評価し、caseラベルの値と一致した箇所から処理を開始する。一致するcaseがない場合はdefaultラベルの処理を実行する(defaultは省略可)。breakを書かないと次のcaseに処理が流れ込む(フォールスルー)。Java7以降でString型、Java14以降でswitch式もサポート。
| 比較項目 | if-else文 | switch-case文 |
|---|---|---|
| 使える条件 | すべての条件式(>, <, &&, ||等) | 等値比較のみ(==相当) |
| 使える型 | すべての型 | int, char, String, enum(Java版に依存) |
| 可読性 | 複雑な条件は読みやすい | 等値比較の多条件分岐で読みやすい |
| パフォーマンス | 条件を上から順に評価 | 内部でテーブル参照(大量の等値比較で高速) |
| Java14以降 | 変化なし | switch式(->記法)で簡潔さが大幅向上 |
「1つの変数の値が複数の固定値のどれと一致するか」を判定する場面がswitch-caseの出番です。例えば「コマンド番号1〜10による処理分岐」「曜日(MON/TUE/WED...)による処理分岐」「ステータスコードによる処理分岐」。逆に、範囲比較(x > 10)や複数変数の組み合わせ判定には if-else が適しています。
02 BASIC SYNTAX 基本構文:数値・文字列・defaultの書き方 switch-caseの構造と各要素の意味を解説
switch-case文の基本構造は以下の通りです。
// switch-case文の基本構文
switch (式) {
case 値1:
// 式 == 値1 のときに実行する処理
break; // ← 忘れると次のcaseに流れる(後述)
case 値2:
// 式 == 値2 のときに実行する処理
break;
default:
// どのcaseにも一致しない場合の処理
break; // defaultのbreakは省略可だが付けた方が安全
}
2-1. 数値でのswitch-case
public class SwitchExample {
public static void main(String[] args) {
int day = 3;
switch (day) {
case 1:
System.out.println("月曜日");
break;
case 2:
System.out.println("火曜日");
break;
case 3:
System.out.println("水曜日"); // ← day=3 なのでこれが実行される
break;
case 4:
System.out.println("木曜日");
break;
case 5:
System.out.println("金曜日");
break;
default:
System.out.println("週末");
break;
}
}
}
// 出力: 水曜日
2-2. String型でのswitch-case(Java7以降)
📚 用語解説
Java7以降のString対応:Java7(2011年リリース)からswitch文でString型を使えるようになった。Java6以前はString型のswitch-caseが使えないため、if-elseかenumで代替する必要があった。現代のJavaプロジェクト(Java8/11/17/21等)ではString型のswitch-caseは標準的に使用できる。
public class SwitchString {
public static void main(String[] args) {
String command = "start";
switch (command) {
case "start":
System.out.println("処理を開始します");
break;
case "stop":
System.out.println("処理を停止します");
break;
case "status":
System.out.println("実行中です");
break;
default:
System.out.println("不明なコマンド: " + command);
break;
}
}
}
// 出力: 処理を開始します
// 注意: String型のswitch-caseは大文字小文字を区別する
// command = "Start" の場合は default に落ちる
// 大文字小文字を無視したい場合: switch (command.toLowerCase()) {
2-3. default句の役割
defaultは、どのcaseラベルにも一致しなかった場合に実行される処理を書く場所です。if-elseのelseに相当します。defaultは省略可能ですが、予期しない値が来た場合のエラー処理のために書いておくのが推奨です。
switch (status) {
case "active":
processActive();
break;
case "inactive":
processInactive();
break;
default:
// 予期しない値が来た場合の安全なハンドリング
throw new IllegalArgumentException("不明なステータス: " + status);
}
03 FALLTHROUGH 【重要】break省略のフォールスルーと意図的な活用 break忘れで全case実行される罠と、意図的に使う場面
Javaのswitch-caseは、一致したcaseから「breakが出てくるまで」処理を実行し続けます。breakなしだと次のcase、そのまた次のcaseと処理が流れ込んでいきます(フォールスルー)。これはJavaのswitch-caseの最大の落とし穴で、初心者がバグを起こす原因第1位です。
// ===== NGパターン:breakを忘れた場合 =====
int num = 1;
switch (num) {
case 1:
System.out.println("1です"); // ← これが実行される
// break がない!
case 2:
System.out.println("2です"); // ← breakなしなのでここも実行される
// break がない!
case 3:
System.out.println("3です"); // ← ここも実行される
break;
default:
System.out.println("その他");
}
// 出力:
// 1です
// 2です
// 3です
// ← num=1なのに3まで実行された!
📚 用語解説
フォールスルー(Fallthrough):switch-case文でbreakを省略した場合に、一致したcaseから次のcaseへ処理が「流れ落ちて」いく現象。Javaはcaseに一致した後、breakに到達するまですべてのcaseの処理を順番に実行し続ける。これはCやC++から引き継いだ仕様で、意図しないフォールスルーは古くからJavaのバグの温床になっている。Java14のswitch式(->記法)はフォールスルーが発生しない設計になっている。
3-1. 意図的なフォールスルーの活用
フォールスルーは「複数の値で同じ処理をしたい」場合に意図的に使うこともできます。ただし、コードを読む人が「break忘れか意図的か」を判断できるよう、コメントを必ず付けることが推奨です。
// 意図的なフォールスルーの例(コメントで意図を明示)
int month = 4;
switch (month) {
case 1:
case 3:
case 5:
case 7:
case 8:
case 10:
case 12:
System.out.println("31日まで");
break;
case 4:
case 6:
case 9:
case 11:
System.out.println("30日まで"); // ← month=4 なのでここが実行される
break;
case 2:
System.out.println("28日または29日");
break;
}
// 出力: 30日まで
// ただし、この書き方は後述の「複数ラベル」でよりすっきり書ける
「まずすべてのcaseにbreakを書いてから処理を書く」という順序で書く習慣を付けると、break忘れを大幅に減らせます。また、Java14以降のswitch式(->記法)はフォールスルーが構造的に起きないため、新規コードではswitch式の使用が推奨されています。
04 MULTI CASE 複数caseを同じ処理にまとめる方法 case a: case b: のまとめ書きとJava14の->記法
複数の値で同じ処理をしたい場合は、case ラベルを並べて書く(複数ラベル)のが最もシンプルな方法です。フォールスルーを活用しますが、「breakなし」で意図的に使っていることが明確なパターンです。
// ===== Java8以前(複数ラベルの従来記法)=====
String dayType;
int day = 6; // 6=土曜日
switch (day) {
case 1:
case 2:
case 3:
case 4:
case 5:
dayType = "平日";
break;
case 6:
case 7:
dayType = "週末"; // ← day=6 なのでここが実行される
break;
default:
dayType = "不明";
break;
}
System.out.println(dayType); // 出力: 週末
// ===== Java14以降(switch式の複数ラベル・カンマ区切り)=====
String dayType14 = switch (day) {
case 1, 2, 3, 4, 5 -> "平日"; // カンマ区切りで複数値を一行に書ける
case 6, 7 -> "週末";
default -> "不明";
};
System.out.println(dayType14); // 出力: 週末
📚 用語解説
複数ラベル(Multiple Case Labels):switch-case文でcase a: case b: のように複数のcaseラベルを続けて書くことで、複数の値に対して同じ処理を実行するパターン。フォールスルーを意図的に利用しているが、処理が直後のcase内に書かれているため「意図的」であることが分かりやすい。Java14以降のswitch式ではcase 1, 2, 3 ->とカンマ区切りで一行に書けるため、より明確。
day=6
6 != 1,2,3,4,5
すべてスキップ
ここから実行開始
代入処理を実行
case 7: は実行されない
05 ENUM enumと組み合わせた実務パターン 現場のJavaコードで頻出するenum + switch-caseの書き方
現場のJavaコードで最もよく見るswitch-caseの使い方が、enum(列挙型)との組み合わせです。文字列や数値でなくenumを使うことで、「定義されていない値が来ることを型システムが防いでくれる」という安全性が得られます。
📚 用語解説
enum(列挙型):Java固有の型で、「決まった値の集合」を型として定義する仕組み。例えば曜日なら MONDAY, TUESDAY, ..., SUNDAY の7種類のみ。String型では"monday"や"Monday"など表記揺れが起きるが、enumなら定義された定数しか使えないためコンパイル時に誤りを検出できる。switch-caseと非常に相性が良い。
// ===== enumの定義 =====
public enum OrderStatus {
PENDING, // 注文受付中
PROCESSING, // 処理中
SHIPPED, // 発送済み
DELIVERED, // 配達完了
CANCELLED // キャンセル
}
// ===== enumとswitch-caseの組み合わせ =====
public class OrderProcessor {
public void processOrder(OrderStatus status) {
switch (status) {
case PENDING:
System.out.println("在庫を確認しています...");
checkInventory();
break;
case PROCESSING:
System.out.println("梱包を開始します...");
startPacking();
break;
case SHIPPED:
System.out.println("配送業者に引き渡しました");
notifyShipping();
break;
case DELIVERED:
System.out.println("配達が完了しました");
sendDeliveryConfirmation();
break;
case CANCELLED:
System.out.println("注文をキャンセルしました");
processRefund();
break;
// defaultはenumの場合は通常不要(コンパイラが漏れを検出)
}
}
}
String型や数値型のswitch-caseではdefaultがないと予期しない値が来たときに何も処理されずバグになります。しかしenum型のswitch-caseでは、すべてのenum値をcaseで網羅していれば理論上default不要です。さらに、Javaコンパイラの警告設定やIDEによっては「caseが漏れている」ことを指摘してくれます。Java14以降のswitch式では漏れがあるとコンパイルエラーになります。
// Java14以降のswitch式でenumを使う(最もモダンな書き方)
public class OrderProcessor {
public String getStatusMessage(OrderStatus status) {
return switch (status) {
case PENDING -> "注文受付中";
case PROCESSING -> "処理中";
case SHIPPED -> "発送済み";
case DELIVERED -> "配達完了";
case CANCELLED -> "キャンセル済み";
// enumの全値を網羅しているためdefault不要(網羅されていないとコンパイルエラー)
};
}
}
06 SWITCH EXPR Java14以降のswitch式(->記法・yield) フォールスルーなし・値を返せる・簡潔なモダンJava構文
Java14でプレビューなしに正式採用されたswitch式は、従来のswitch文を大幅に改善した新しい構文です。3つの主要な改善があります。
📚 用語解説
switch式(Switch Expression):Java14で正式採用されたJavaの新構文。従来の「switch文(処理を分岐させる)」に対して「switch式(値を返す)」として機能する。-> 記法(アロー構文)を使い、case 値 -> 式という形で書く。breakが不要でフォールスルーが起きない。複数処理が必要な場合はブロック{}を使い、yieldキーワードで値を返す。
// ===== 従来のswitch文(Java8以前の書き方)=====
String result;
int month = 4;
switch (month) {
case 1: case 3: case 5: case 7: case 8: case 10: case 12:
result = "31日";
break;
case 4: case 6: case 9: case 11:
result = "30日";
break;
case 2:
result = "28/29日";
break;
default:
result = "不明";
break;
}
// ===== Java14以降のswitch式(->記法)=====
String result14 = switch (month) {
case 1, 3, 5, 7, 8, 10, 12 -> "31日"; // カンマ区切り
case 4, 6, 9, 11 -> "30日";
case 2 -> "28/29日";
default -> "不明";
};
// 圧倒的にすっきりした!
6-2. yieldキーワード(複数行の処理が必要な場合)
->の右辺に複数の処理が必要な場合は、ブロック{}を使いyieldで値を返すことができます。
// yieldを使って複数行処理を含むswitch式
String description = switch (status) {
case PENDING -> {
log("注文を受け付けました"); // ログ出力
notifyAdmin(); // 通知
yield "受付完了"; // yieldで値を返す(returnではない)
}
case SHIPPED -> {
String trackingNo = generateTrackingNumber();
sendTrackingEmail(trackingNo);
yield "発送済み(追跡番号: " + trackingNo + ")";
}
default -> "処理中"; // 1行のcaseにyieldは不要
};
📚 用語解説
yieldキーワード:Java14で追加されたキーワードで、switch式のブロック({})内から値を返すために使う。switch式の->右辺がブロックの場合、returnではなくyieldで値を指定する。returnを使うとメソッド全体からの返り値となるため区別が重要。従来のswitch文(->ではなく:を使う場合)ではbreakの代わりにbreak 値;でも値を返せる(ただし->記法の方が一般的)。
07 COMMON ERRORS よくあるミス・エラーとデバッグ方法 switch-caseで詰まる5つのよくある問題と解決策
7-1. breakの付け忘れ(フォールスルー)
前述の通り最多のミスです。breakなしにすると予期しない処理が実行されます。デバッグ方法: System.out.println("case X に入った");を各caseに一時的に追加して実行の流れを確認します。
7-2. String型の大文字小文字ミス
// NG: "Start"(大文字S)では "start"(小文字)のcaseにマッチしない
String command = "Start";
switch (command) {
case "start": // ← "Start" != "start" なのでスキップ
System.out.println("開始");
break;
}
// OK: 大文字小文字を統一してから比較
switch (command.toLowerCase()) { // ← toLowerCase()で小文字に統一
case "start":
System.out.println("開始");
break;
}
7-3. nullが渡されたときのNullPointerException
// NG: commandにnullが入るとNullPointerExceptionが発生
String command = null;
switch (command) { // ← NullPointerException!
case "start": break;
}
// OK: nullチェックを先に行う
if (command == null) {
System.out.println("コマンドがnullです");
} else {
switch (command) {
case "start": break;
}
}
7-4. case内でローカル変数を宣言すると別のcaseから参照できない問題
// NG: case内で宣言した変数を別のcaseから参照しようとするとコンパイルエラー
switch (x) {
case 1:
int y = 10; // ここで宣言
break;
case 2:
System.out.println(y); // ← コンパイルエラー(yが到達可能かどうか不明)
break;
}
// OK: switch外でyを宣言してからcase内で代入
int y;
switch (x) {
case 1:
y = 10;
break;
case 2:
y = 20;
break;
default:
y = 0;
}
System.out.println(y); // OK
7-5. switchの式部分に使えない型のコンパイルエラー
// NG: floatやdouble、longはswitch文では使えない(Java14以降も同様)
float f = 1.5f;
switch (f) { // ← コンパイルエラー: floatはswitch文で使えない
case 1.5f: break;
}
// OK: intにキャスト(精度に注意)
switch ((int) f) {
case 1: break;
case 2: break;
}
08 USE CASES 実務ユースケース別テンプレートコード集 メニュー選択・状態遷移・コマンド処理など実務で使うパターン
8-1. CLIメニュー選択の処理
import java.util.Scanner;
public class MenuApp {
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
System.out.println("選択してください: 1.一覧 2.追加 3.削除 0.終了");
int choice = scanner.nextInt();
switch (choice) {
case 1:
showList();
break;
case 2:
addItem();
break;
case 3:
deleteItem();
break;
case 0:
System.out.println("終了します");
System.exit(0);
break;
default:
System.out.println("無効な選択です: " + choice);
break;
}
}
}
8-2. HTTPステータスコードによる処理分岐
public class HttpResponseHandler {
public String handleStatusCode(int statusCode) {
return switch (statusCode) {
case 200 -> "OK - リクエスト成功";
case 201 -> "Created - リソース作成成功";
case 400 -> "Bad Request - リクエスト不正";
case 401 -> "Unauthorized - 認証が必要";
case 403 -> "Forbidden - アクセス権限なし";
case 404 -> "Not Found - リソースが存在しない";
case 500 -> "Internal Server Error - サーバーエラー";
case 503 -> "Service Unavailable - サービス利用不可";
default -> "Unknown Status: " + statusCode;
};
}
}
8-3. 状態遷移マシン(State Machine)
// トラフィックライトの状態遷移
public enum TrafficLight { RED, YELLOW, GREEN }
public class TrafficController {
public TrafficLight nextState(TrafficLight current) {
return switch (current) {
case RED -> TrafficLight.GREEN;
case GREEN -> TrafficLight.YELLOW;
case YELLOW -> TrafficLight.RED;
};
// enumの全値を網羅しているためdefault不要
// 網羅されていない場合はコンパイルエラー(Java14 switch式の安全性)
}
}
09 AI ASSIST Claude CodeでJava switch-caseを自動生成する enumの定義からswitch式のテンプレートまで日本語指示で即座に生成
ここまでswitch-caseの詳細仕様・フォールスルー罠・Java14の新構文まで解説しましたが、実際にコードを書く場面で「enumの設計から書き直す」「Java8向けのコードをJava14+のswitch式に書き換える」といった作業は手間がかかります。
Claude Codeに「こういう処理をswitch-caseで書きたい」と日本語で指示するだけで、フォールスルー対策・enum設計・Java14対応をすべて考慮したコードが即座に返ってきます。
| ユースケース | Claude Codeへの指示例 |
|---|---|
| 基本的なswitch-case生成 | 「Javaで注文ステータス(PENDING/PROCESSING/SHIPPED/DELIVERED/CANCELLED)によって処理を分岐するswitch-caseを書いて。Java17対応で、enumとswitch式(->記法)を使って」 |
| レガシーコードのモダン化 | 「以下のJava8のswitch文をJava17のswitch式(->記法)に書き直して。breakなしのフォールスルーを使っている箇所も安全に変換して。[コードを貼り付け]」 |
| enum + switch-case設計 | 「ECサイトの注文フローを状態遷移として設計したい。状態をenumで定義して、各状態からの遷移をswitch式で書いてください。状態: 注文受付→支払い待ち→支払い完了→発送準備→発送済み→配達完了」 |
| 複数言語対応 | 「言語コード(ja/en/zh/ko)でメッセージを切り替えるJavaのswitch式を書いて。Java14以降の記法で、それ以外の言語コードはデフォルトで英語を使う」 |
「状態遷移を
switch式で書いて」
enum定義+
switch式を含む
完全なコード
コンパイル+
動作確認
さらに改善・
バリエーション追加
10 CONCLUSION まとめ:Javaのswitch-case完全習得のポイント フォールスルー対策・switch式・enum設計の3点セット
JavaやPythonを使った業務システムのAI活用・自動化を進めたい方へ
プログラミング言語の文法を覚えることより、業務でそれを使って何を自動化するかの方が価値があります。
AI鬼管理では、Javaを含む業務システムのAI組み込み・自動化設計を支援しています。
NEXT STEP
この記事の内容を、あなたのビジネスで
実践してみませんか?
AI活用を自社で回せるようになりたい方へ
AI鬼管理
Claude Code・Cowork導入支援から業務設計・社内浸透まで実践ベースで伴走。「自社で回せる組織」を90日で作る経営者向けトレーニング。
よくある質問
Q. Java switch-caseとif-elseはどちらが速いですか?
A. 大量の等値比較(10個以上の条件がある場合など)では、switch-caseがif-elseより高速になる傾向があります。Javaコンパイラはswitch-caseを内部でlookupswitch(線形探索)またはtableswitch(配列インデックス参照)のバイトコードに最適化します。特に連続した整数値のcase(1,2,3,...)ではtableswitchが使われ、O(1)の定数時間で分岐先を決定できます。ただし、10個未満の条件ではif-elseとの差はほぼありません。コードの可読性を優先して選択し、パフォーマンスが問題になってから最適化を検討するのが一般的です。
Q. Java switch-caseでfloatやdoubleが使えないのはなぜですか?
A. 浮動小数点数(float・double)は内部表現の誤差問題から「完全な等値比較」が保証できないためです。例えば0.1 + 0.2 == 0.3がfalseになるのは有名な例です。switch-caseは等値比較を前提とする構文のため、誤差が生じうる型は排除されています。float/doubleの比較が必要な場合は if (Math.abs(f - 0.5) < 1e-9) { ... } のような閾値を使った比較をif-elseで行います。
Q. Java14のswitch式はどのJavaバージョンから使えますか?
A. switch式の->記法はJava12・13でプレビュー機能として追加され、Java14で正式採用されました。Java14以降(Java14, 15, 16, 17, 21等)であれば--enable-previewフラグなしで使えます。現在のLTS(長期サポート)バージョンであるJava17・Java21はどちらも対応しています。ただし、Java8・Java11を使い続けているプロジェクトでは従来のswitch文を使う必要があります。
Q. Javaのswitch-caseでenumを使うと何が良いのですか?
A. String型や数値でswitch-caseを書くと、定義されていない値(タイポ、想定外の入力等)が来てもコンパイルエラーにならずdefaultに落ちるだけです。一方、enum型のswitch-caseでは、①コンパイラがenum値を解析して全て網羅しているかチェックできる、②Java14以降のswitch式ではenumの全値を網羅しないとコンパイルエラーになる(defaultを省略可能)、③IDEが未処理のcaseを警告してくれる、という安全性の恩恵があります。現場のJavaではswitch + enumは定石パターンです。
Q. yieldとreturnの違いは何ですか?
A. returnはメソッド全体からの戻り値を返してメソッドを終了しますが、yieldはswitch式のブロック({})内から値を返してswitch式の評価を完了します。switch式がメソッド内の途中にある場合、yieldはswitch式の結果値を確定させるだけで、メソッドはその後も続きます。逆に言うと、switch式のブロック内でreturnを使うと、switch式の結果を返すのではなくメソッド全体を終了させてしまうため、意図した動作にならない場合があります。
Q. Claude CodeでJava switch-caseコードを書いてもらうとき、どう指示すると良いですか?
A. ①使うJavaバージョン(Java8/11/17/21等)、②分岐させたい値の型(int/String/enum)と値の一覧、③各caseで何をしたいか(処理内容またはreturnする値)、④switch文(処理)かswitch式(値を返す)か、の4点を指定すると最も正確なコードが得られます。例:「Java17、注文ステータスのenum(PENDING/PROCESSING/SHIPPED/DELIVERED/CANCELLED)、各ステータスに対応する日本語メッセージをStringで返す、switch式の->記法で書いて」という形です。
Claude Codeで業務自動化を90日で叩き込む
経営者向けの伴走型パーソナルトレーニング
Claude Code を業務に落とし込む
専門研修コース一覧
受講者本人の業務を題材に、「使いこなせる」状態になるまで伴走する研修プログラム。1対1特化型・ハンズオン・法人講座の3コースを展開中。業務特化・実装まで踏み込むタイプのClaude Code研修です。
研修コース一覧を見る →AI鬼管理へのお問い合わせ
この記事を読んで気になった方へ。
AI鬼管理の専門スタッフが、御社に最適な
業務自動化プランを無料でご提案します。




