Menu

Java の if-else: 例で学ぶ条件分岐

if、else if、else を使って Java で判断を行う方法: boolean 条件、分岐の連鎖、ネスト、三項演算子、そして多くの人がつまずきがちな典型的なミスを解説します。

このページのコードはエディタで実行できます - 編集してすぐに結果を確認できます。

if で判断する

プログラムはデータに反応する必要があります。合格か不合格か、在庫ありか売り切れか、有効か無効か。if 文は、条件に基づいてどのコードを実行するかを Java が選ぶための仕組みです。

if はかっこの中に boolean 条件を取り、その条件が true のときだけ波かっこ内のブロックを実行します。

条件 score >= 60true なので、メッセージが出力されます。閉じ波かっこの後の行は常に実行されます。それは if の外側にあるからです。score40 に変えると、「passed」の行は完全にスキップされます。

C とは違い、Java は boolean が必要な場所に数値を置くことを許しません。if (score) はコンパイルエラーです。条件は、比較 (>>===!=) や論理演算 (&&||!) から作られた本物の boolean 式でなければなりません。

else を追加する

else は「それ以外」の経路、つまり条件が false のときだけ実行されるコードを与えます。

2 つのブロックのうちちょうど 1 つだけが実行されます。両方が実行されることも、どちらも実行されないこともありません。else には独自の条件はなく、if が拾わなかったものすべてを単に受け止めます。

else if で連鎖させる

結果が 3 つ以上ある場合は、else if で条件を連鎖させます。Java は上から下へ調べ、条件が真である最初のブロックを実行して、残りはスキップします。

順序が重要です。84 はまず >= 90 に対して(偽)、次に >= 80 に対して(真)調べられるため、B で止まり、下限のチェックは一切行いません。だからこそ score >= 80 && score < 90 と書く必要もありません。2 つ目の分岐に到達した時点で、score が 90 未満だったことはすでに保証されています。最も狭い、あるいは最も優先度の高い条件を先頭に置きましょう。

末尾の else は受け皿です。ここで省くとコンパイルエラーになります。出力する時点で grade が未代入のままになりうるからです。

値を比較する: == と equals()

Java で最もよくある if のバグは、文字列== で比較することです。プリミティブ (intdoublecharboolean) には == が正しいです。オブジェクトでは、== は「これはメモリ上の同じオブジェクトか?」を問い、.equals() は「これらは同じ内容を持つか?」を問います。そして、ほとんどの場合あなたが欲しいのは後者です。

出力されるのは 2 つ目のメッセージだけです。new String("yes") はリテラル "yes" とは別のオブジェクトなので ==false ですが、テキストは同一なので .equals()true です。経験則: プリミティブは ==、オブジェクトは .equals() を使います。

変数が null になりうるときに NullPointerException を避ける安全な手は、リテラルを先に置くこと、つまり if ("yes".equals(input)) です。リテラルは決して null にならないからです。

条件の組み合わせとネスト

条件は &&(かつ)、||(または)、!(否定)で組み合わせられます。また、あるチェックが先のチェックを通過した後でのみ意味を持つ場合は、if を別の if の中にネストできます。

&&|| は短絡評価します。a && ba が偽なら、Java は b を一切評価しません。これはエラーを防ぐのに便利です。if (s != null && s.length() > 0) は安全です。s が null のとき長さのチェックがスキップされるからです。可能なときは深いネストより && での組み合わせを優先しましょう。フラットなコードのほうが、波かっこのピラミッドよりはっきり読めます。

典型的な落とし穴: 単一の = は代入、== は比較です。if (x = 5) と書くと int ではコンパイルエラー(良いこと)ですが、boolean に対する if (flag = true) はコンパイルが通り、こっそり代入してしまいます。気をつけましょう。

三項演算子

2 つののどちらかを選ぶだけが目的なら、三項演算子 ?: はコンパクトな 1 行です。condition ? a : b を「条件が真なら a、そうでなければ b」と読みます。

三項演算子は、代入したり直接渡したりできる値を生み出します。単純な選択にとどめましょう。どちらかの分岐に複数の文や本格的なロジックが必要なら、完全な if-else のほうが読みやすく、ネストした三項演算子はすぐにパズルになってしまいます。

落とし穴: 省略可能な波かっこのワナ

Java は分岐に文が 1 つだけのとき波かっこを省略できますが、これは微妙なバグを招きます。インデントが嘘をつくのです。

if (loggedIn)
    System.out.println("Welcome");
    System.out.println("Loading dashboard");   // NOT part of the if!

if に制御されるのは最初の行だけで、2 行目はインデントが何を示唆していようと常に実行されます。たとえ 1 行でも常に波かっこを使えば、この種のミスはすべて消えます。

次へ: switch

if-else if の連鎖は、各分岐が異なる条件をテストするときに最適です。しかし、1 つの値を多くの固定された候補(曜日名、メニューの選択、enum)と照合する場合、長い else if のはしごは繰り返しが多くなります。switch 文はまさにそのために作られており、それが次のページです。

よくある質問

Java で if-else 文はどう書きますか?

if のあとのかっこに boolean 条件を入れ、続いて波かっこ内に実行するコードを書き、条件が偽のときのために任意で else ブロックを書きます: if (score >= 60) { System.out.println("Pass"); } else { System.out.println("Fail"); }。条件は boolean に評価される必要があります。Java は C のように int を受け付けません。

Java の if 文で == と equals() の違いは何ですか?

== は 2 つの参照が同じオブジェクトを指しているかを調べ、.equals() は内容を比較します。int のようなプリミティブには == を使います。オブジェクト、特に String には .equals() を使います: if (name == "Sam") ではなく if (name.equals("Sam")) です。文字列に == を使うのは、Java で最もよくある if のバグです。

Java の三項演算子とは何ですか?

三項演算子 condition ? valueIfTrue : valueIfFalse は、値を生み出すコンパクトな if-else です。たとえば String label = age >= 18 ? "adult" : "minor"; は条件に応じて 2 つの値のどちらかを代入します。単純な値の選択に使い、各分岐で実行すべきロジックがあるときは完全な if-else を使いましょう。

Coddy programming languages illustration

Coddyでコードを学ぼう

始める