if-else 文

生田 陸人
LuaGate エンジニア / 現役エンジニア
編集 LuaGate編集部

このレッスンで分かること

  • if-else は「true のとき / false のときの どちらか必ず一方 を実行する」二者択一の構文です
  • 偶数判定の定石は n % 2 == 0、奇数を n % 2 == 1 で書くと負数で誤判定
  • 最小例は if (n % 2 == 0) return "even"; else return "odd";

if-else 文 とは

if-else でどちらかの処理を必ず実行する書き方を学び、偶数・奇数を判定するメソッドを書けるようになろう。

if-else 文とは

前のレッスンで学んだ if 文は「条件が true のときだけ何かをする」というシンプルな仕組みでした。でも実際のプログラムでは「条件が成り立つときは A、成り立たないときは B」という 二者択一 の判断がもっと頻繁に登場します。たとえば「ログインしていれば名前を表示、していなければ ゲスト と表示」「点数が 60 以上なら合格、未満なら不合格」のように、どちらかを必ず実行する ケースですね。

このときに登場するのが if-else 文です。Java だけでなく Python JavaScript C Ruby など、ほぼすべての言語に同じ顔ぶれで存在する基本中の基本構文です。

if 単体は「条件が true のときだけ実行する」、if-else は「true のとき / false のときの どちらか必ず一方 を実行する」 という違いを最初にしっかり覚えておきましょう。この差を曖昧にすると、後でバグの原因になります。

基本の文法

if-else 文の文法は次のとおりです。

Java

if (条件式) { // 条件式が true のときに実行される } else { // 条件式が false のときに実行される }

ポイントになる部分を箇条書きで整理しておきます。

  • if後ろに丸カッコ () を書き、その中に boolean を返す条件式を入れる
  • { ... } のブロックに、その分岐で実行する文を並べる
  • else の後ろには 条件式は書かない (丸カッコは付けない)
  • else のブロックは省略してもよいが、書いた場合は必ず 直前の if ブロックの直後 に置く

else の前後で改行するスタイル (} の次の行に else {) と、} else { と同じ行に書くスタイルがあります。Java の標準的なコーディング規約 (Oracle 公式や Google Java Style Guide) では } else { と同じ行に並べる スタイルが推奨されているので、本コースでもそれに合わせます。

偶数・奇数を判定する

このレッスンの課題は「整数 n が偶数なら "even"、奇数なら "odd" を返す」というものです。偶数か奇数かはどうやって判定するかというと、Java剰余演算子 % を使います。

% は「割り算の余り」を返す演算子です。たとえば 10 % 3114 % 54 です。これを 2 で割った余りで考えると、次のような性質があります。

  • 偶数を 2 で割った余りは必ず 0
  • 奇数を 2 で割った余りは必ず 1-1 (負の奇数は -1 になる)
nn % 2判定
40even
71odd
00even
-3-1odd (n % 2 == 1 だと誤判定)
-40even

だから「偶数か?」を判定したいときは n % 2 == 0 という式を書くのが定石です。true なら偶数、false なら奇数、というシンプルなルールに落とせます。

「奇数なら n % 2 == 1」と書くこともできますが、負の奇数 (-3 -7 など) では余りが -1 になるので、Java だと意図せず弾かれます。偶数判定 n % 2 == 0 を基準にして、else 側で奇数を返すのが最も安全です。

コードに落とすと次のような形になります。

Java

public class Solution { public static String evenOrOdd(int n) { if (n % 2 == 0) { return "even"; } else { return "odd"; } } }

n4 が入ってきたら 4 % 20 なので if ブロックが実行され "even" が返ります。n7 が入ってきたら 7 % 21 なので else ブロックに進み "odd" が返ります。n0 のときも 0 % 20 なので "even"n-3 なら -3 % 2-1 なので else 側に行き "odd" が返ります。

分岐の流れを図で見る

if-else の動きを図にすると、必ず 2 本の道のうち 1 本だけ が選ばれて合流するイメージになります。if 単体が「分かれ道があってもどちらか一方は何もしない」のに対し、if-else は「どちらの道を通っても必ず合流点に戻ってくる」のが特徴です。

diagram (will load when visible)

この図のように、Cond のひし形から出る矢印は必ず truefalse2 本 で、どちらか一方を必ず通って End にたどり着きます。これが if-else の最大の特徴です。逆に言うと、if-else を使ったら「どちらの場合も処理を書き忘れていないか」を必ずチェックする習慣をつけてください。

プログラムのバグの多くは「else 側の考慮漏れ」から生まれます。「true のときは OK、で、false のときは?」と毎回自問するクセをつけましょう。これだけでバグの量がぐっと減ります。

else 単体は使えない

Java (というか if-else を持つほぼすべての言語) で 絶対に守らないといけないルール が、else は単体で書けないということです。else は必ず 直前に if がある 状態でしか使えません。

Java

// これはコンパイルエラー else { System.out.println("hello"); }

このコードを書くと Java のコンパイラは 'else' without 'if' のようなエラーメッセージを出します。else 単体だと「何の条件に対する裏側なのか」がわからないので、文法的に許されないのです。

同じ理由で、ifelse の間に 別の文を挟むこともできません

Java

// これもコンパイルエラー if (n % 2 == 0) { return "even"; } System.out.println("check"); // ← ここに割り込ませると else が孤立する else { return "odd"; }

if ブロックの閉じ }直後else を書く、というのが鉄則です。

よくある間違い

if-else で初学者がよくやらかすミスを 3 つ紹介します。これは本当によく見るパターンなので、自分のコードでも疑ってみてください。

  • else の前にセミコロン ; を入れるif (n % 2 == 0) { ... }; のように } の後ろに ; を書いてしまうと、その時点で文が終わってしまい、続く else が孤立してエラーになります。} else { の前に余計な ; を入れない、これが鉄則です
  • else に条件を書いてしまう (else if との混同)else (n > 0) { ... } のように、else の後ろに丸カッコで条件を書こうとする間違いです。条件付きの else を書きたいときは else if (n > 0) { ... } のように else if と書きます。else 単体は条件を取らない、と覚えてください
  • %== の優先順位の勘違いn % 2 == 0 という式は % のほうが == より先に計算される ので、内部的には (n % 2) == 0 と評価されます。心配ならカッコを付けて (n % 2) == 0 と書いてもまったく問題ありません。むしろ可読性が上がるので、慣れないうちはカッコを付けるのもおすすめです

もう一つ、=== の取り違えは前のレッスンでも触れた通り if の条件式でも頻発します。if (n % 2 = 0) と書くと、Java代入演算子 として解釈しようとしてコンパイルエラーになります。条件式の中では必ず == を使う、と毎回意識してください。

エラーメッセージで 'else' without 'if' incompatible types: int cannot be converted to boolean のような英文が出てきたら、今紹介した 3 つのどれかを疑うと 8 割方当たります。

Before / After で書き比べる

if-else を使わずに同じ処理を if 単体で書こうとすると、どうしても return を 2 回書く変数で受ける かの工夫が必要になります。

Java

// Before: if 単体だけで書く public static String evenOrOdd(int n) { String result = "odd"; if (n % 2 == 0) { result = "even"; } return result; }

動きは同じですが、result という一時変数が必要で、初期値に頼っている ぶん読み手は「もし if が成り立たなかったら?」を頭の中で追わないといけません。

Java

// After: if-else でスッキリ public static String evenOrOdd(int n) { if (n % 2 == 0) { return "even"; } else { return "odd"; } }

if-else を使うと どちらの分岐も明示 されるので、読み手が「true のときと false のときの両方を考えてあるな」と一目で安心できます。コードは書く時間より 読む時間のほうが圧倒的に長い ので、こういう小さな読みやすさの積み重ねが効いてきます。

この章のポイント

ここまでの要点 if-else は二者択一、必ずどちらか 1 本を通る。偶数判定は n % 2 == 0 を基準に、奇数判定の % 2 == 1 は負数で破綻。else は単独で書けず、必ず直前に if が必要。

やってみよう

それでは右側のエディタで課題に挑戦しましょう。Solution.evenOrOdd(int n) メソッドは、n が偶数なら "even"、奇数なら "odd" を返します。

書く手順は次のとおりです。

  1. if (n % 2 == 0) { で偶数の分岐を開く
  2. その中で return "even"; を返す
  3. } else { で奇数の分岐を開く
  4. その中で return "odd"; を返す
  5. 最後の } でメソッドの本体を閉じる

慣れてきたら、evenOrOdd(0) evenOrOdd(-3) evenOrOdd(1000001) のような値を自分で予想してから実行してみてください。0 は偶数 (0 % 2 == 0) なので "even"-3 は奇数なので "odd"1000001 は奇数なので "odd" ですね。

この if-else の感覚を掴むと、次のレッスンで学ぶ else if (3 つ以上の分岐) や switch 文への橋渡しがスムーズになります。条件分岐はプログラミングの中心スキルなので、丁寧に手を動かしながら身につけていきましょう。

よくある質問

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 標準を固めるのが効率的です。

次のレッスン

次は else if で複数分岐 で、if-else でどちらかの処理を必ず実行する書き方を学び、偶数・奇数を判定するメソッドを書けるようになろう を学びます。

事前確認 — 進む前に次の 3 つができることを確認しましょう。

  1. if-else の要点を自分の言葉で説明できる
  2. このレッスンの最小コード (または操作手順) を見ずに書ける
  3. 練習問題やクイズで間違えた箇所を読み直して理解した

理解度チェック (30 秒)

Q. if-else とは何か、1 文で説明してください。

この章のポイント

A. 本文の「このレッスンで分かること」または冒頭の説明文を見直し、自分の言葉で要約できれば OK。詰まったら本レッスンの最初の H2 セクションを読み返してみましょう。

関連レッスン

要件

  1. クラス名は Solution、メソッド名は evenOrOdd、引数は int n の 1 つにすること
  2. 戻り値の型は String で、偶数なら "even"、奇数なら "odd" を返すこと
  3. 剰余演算子 %if-else 文を使って判定すること

入出力例

test-cases.txt

evenOrOdd(4)"even" evenOrOdd(7)"odd" evenOrOdd(0)"even" evenOrOdd(-3)"odd" evenOrOdd(-8)"even"

ヒント

main.java
main.java
学習モード

メモ

if-else 文

⌘S で保存