else if で複数分岐
このレッスンで分かること
if-else if-elseは上から順に評価、最初に true になったブロックだけが実行されます- 不等号の連鎖では「厳しい条件を上に、ゆるい条件を下に」が鉄則
- 最小例は
if (n > 0) return "positive"; else if (n == 0) return "zero"; else return "negative";
else if で複数分岐 とは
if-else if-else で 3 つ以上の分岐を書き分けよう。評価順序とよくある落とし穴も学びます。
3 つ以上の道に分かれたい
前のレッスンで if と else を使って「Yes か No か」の 2 択を書きました。でも現実のプログラムでは、positive / zero / negative のように 3 つ以上 に分かれる場面のほうがずっと多いです。たとえば成績判定なら A B C D F の 5 段階、信号機なら red yellow green の 3 状態、ゲームなら win lose draw の 3 通り、というふうに、Java のプログラムは常に「複数の道」を扱います。
2 択しか書けないと「真ん中の状態」を表現できません。
zeroのような中立的な値、drawのような引き分け、unknownのような第三の状態は、3 つ以上の分岐があってはじめて素直に書けるのです。
そこで登場するのが else if です。if で 1 つ目を判定し、外れたら else if で 2 つ目を判定し、それも外れたら else if で 3 つ目を判定し、最後の保険として else で受け止める、という連鎖が Java の基本パターンです。本レッスンではこの if-else if-else の組み立て方、評価される順番、そしてやってしまいがちな失敗を一気に押さえます。
文法の基本形
まずは典型的な 3 分岐の形を見てみましょう。
Java
public class Solution {
public static String signOf(int n) {
if (n > 0) {
return "positive";
} else if (n == 0) {
return "zero";
} else {
return "negative";
}
}
}わずか 9 行ですが、if / else if / else の三段構えがそろっています。重要なポイントは次のとおりです。
if (条件)を 1 個目 に書く- 2 個目以降は
else if (条件)を必要なだけ並べる - 最後は
elseで「それ以外すべて」を受け止める (省略も可) - 各ブロックは
{ ... }で囲み、中の文末には;を付ける else ifは 半角スペースを 1 つはさんで 2 単語 で書く (elseifは別物)
書き並べる順序が大事で、Java は 上から順に 条件を見て、最初に真になったブロックだけを実行し、残りはすべてスキップします。switch 文と違って break は不要、というのが if 連鎖の特徴です。
評価順序を図で追う
上から順に判定が走るイメージを Mermaid で描くと、次のような流れになります。
入力ごとの評価ルートを表にすると、次のとおりです。
n | n > 0 | n == 0 | 戻り値 |
|---|---|---|---|
| 5 | true | (見ない) | "positive" |
| 0 | false | true | "zero" |
| -3 | false | false | "negative" |
| 100 | true | (見ない) | "positive" |
「最初に当たった条件で抜ける」というのが
if-else if連鎖の鉄則です。上に書いた条件のほうが優先される、と覚えてください。
順序を間違えるとどうなるか
上から順に評価されるという仕様は、書く順番を間違えると 想定外の結果 を生みます。たとえば「点数 → 評価」の判定を、雑に書くとこうなります。
Java
public static String grade(int score) {
if (score >= 60) {
return "C";
} else if (score >= 80) {
return "B";
} else if (score >= 90) {
return "A";
} else {
return "F";
}
}一見正しそうですが、grade(95) を呼ぶと A ではなく C が返ります。score >= 60 が最初に true になった瞬間、残りの else if は無視されてしまうからです。直すには 範囲が狭い (= 厳しい) 条件を上に 書きます。
Java
public static String grade(int score) {
if (score >= 90) {
return "A";
} else if (score >= 80) {
return "B";
} else if (score >= 60) {
return "C";
} else {
return "F";
}
}不等号の連鎖を書くときは「大きい値・厳しい条件を上に、ゆるい条件を下に」と唱えながら並べると安全です。
else は省略してもよい?
else は 省略可能 です。たとえば「正の数のときだけ何かしたい」だけなら、else if も else も不要で、if 単独で十分です。ただし、戻り値があるメソッドで if だけ書いて return を else に頼っていない場合、コンパイラに「すべての経路で return していない」と怒られることがあります。今回の signOf のように return を 3 本書く設計なら、最後を else にすることで Java が「ここに必ず到達する」と判断でき、安全です。
「最後の
elseを書くかどうか」は迷ったら書く、で OK です。読み手にも「これで全パターンを尽くした」という意思表示になります。
ネストした if との違い
同じ判定は、ネスト (入れ子) した if でも一応書けます。
Java
public static String signOfNested(int n) {
if (n > 0) {
return "positive";
} else {
if (n == 0) {
return "zero";
} else {
return "negative";
}
}
}動きは同じですが、{ と } の階層が深くなり読みづらくなります。else if 連鎖を使えば階層が増えず、positive / zero / negative が 横に並んで 比較しやすくなります。3 つ以上の排他的な分岐は、原則として else if 連鎖で書くと覚えましょう。
ネストは「複雑な前提条件を絞り込む」ときに使い、
else ifは「並列なケース分け」に使う、と用途を分けるのがおすすめです。
よくある間違い
初心者が else if でつまずくポイントは、ほぼ次の 3 つに集約されます。
- 範囲の広い条件を上に書いてしまう — 先ほどの
gradeの例。score >= 60を一番上に書くと、95点でもC判定になります。厳しい条件を上、ゆるい条件を下 が鉄則 else ifをelseifと書く —Javaではelseとifの 間に半角スペースが必要 です。elseifと続けて書くと';' expectedや'else' without 'if'のようなコンパイルエラーになります。Pythonのelifとも違うので注意- 最後の
elseを忘れてreturnが足りない —ifとelse ifだけ書いてelseを書かないと、戻り値のあるメソッドではmissing return statementのコンパイルエラーになります。最後はelseでガッチリ閉じる、またはifの外側でreturnを 1 本用意する
もうひとつ地味に多いのが、== を = と書き間違えるミスです。n == 0 は「比較」、n = 0 は「代入」で、Java では if の条件として = を書くと boolean を要求する場所に int を渡したことになりエラーになります。== を 2 つ書く、と指差し確認してください。
エラーメッセージに
';' expectedや'else' without 'if'が出たら、まずelseifと書いていないか、{}の数が合っているかを確認しましょう。9 割はこのどちらかです。
ここまでの要点
if-else if-else は上から順に評価、最初の true で打ち止め。範囲条件は「厳しい→ゆるい」の順に並べる。else if は 2 単語 (elseif は NG)、最後の else は迷ったら書く。
やってみよう
それでは課題に挑戦してみましょう。Solution.signOf(int n) を完成させ、n の符号を表す文字列を返してください。手順は次のとおりです。
- 右側のエディタで
signOfメソッドの中身を書く n > 0のときは"positive"、n == 0のときは"zero"、それ以外は"negative"を返す- 「実行」ボタンを押して、テストが全部緑になることを確認する
書き終わったら、n が 1 0 -1 100 -100 のような値でそれぞれどの分岐に入るかを、頭の中でトレースしてみてください。if (n > 0) から始まり、上から順にひとつずつ判定が走る感覚がつかめると、もっと複雑な else if 連鎖もこわくなくなります。
余裕があれば、signOf をネストした if でも書き直してみたり、判定順序をわざと入れ替えて何が起きるかを観察してみたりすると、else if のありがたみが体に染みこみます。
よくある質問
Q. Java と他言語の文法はどう違いますか?
A. Java は静的型付けで、変数宣言時に型を明示します(int x = 0;)。中括弧でブロックを表し、文末にセミコロンが必要です。Python の動的型付けや JavaScript の柔軟さに慣れていると最初は窮屈ですが、コンパイル時にバグが発見できる安全性がメリットです。
Q. コードが動かないときに最初に見るべき場所は?
A. コンパイルエラーは行番号とエラー種別(cannot find symbol、incompatible types など)が表示されます。実行時例外はスタックトレースの最初の at ... が原因行です。IDE(IntelliJ / VS Code)の警告も丁寧に潰すと、半分のバグは未然に防げます。
Q. Java の習得後に学ぶべき技術は何ですか?
A. 基本構文を抑えたら java-intermediate(コレクション / ジェネリクス / Stream / 例外)に進み、Spring Boot や Web 開発に展開するのが王道です。クラウド時代は Kotlin / Scala への展開も視野に入りますが、まずは Java 標準を固めるのが効率的です。
次のレッスン
次は 成績判定プログラム で、if-else if-else で 3 つ以上の分岐を書き分けよう を学びます。
事前確認 — 進む前に次の 3 つができることを確認しましょう。
- else if の要点を自分の言葉で説明できる
- このレッスンの最小コード (または操作手順) を見ずに書ける
- 練習問題やクイズで間違えた箇所を読み直して理解した
理解度チェック (30 秒)
Q. else if とは何か、1 文で説明してください。
A. 本文の「このレッスンで分かること」または冒頭の説明文を見直し、自分の言葉で要約できれば OK。詰まったら本レッスンの最初の H2 セクションを読み返してみましょう。
関連レッスン
要件
- クラス名は
Solution、メソッド名はsignOf、引数はint n1 つにすること - 戻り値の型は
Stringで、"positive"/"zero"/"negative"のいずれかを返すこと if/else if/elseを組み合わせて 3 分岐で書くこと (ネストやswitchではなくelse if連鎖で)
入出力例
test-cases.txt
signOf(5) → "positive"
signOf(0) → "zero"
signOf(-3) → "negative"
signOf(100) → "positive"