Java入門:条件分岐のよくある間違い

レッスンの本文で注意している点を、つまずきの側から29件ぶん並べ直しました。書いた覚えのある形が見つかったら、 そのままレッスンに戻って前後を読めます。

if 文の基本

レッスンを読む

{ } を省略してハマる

if (x > 0) return "positive"; のように { } なしで 1 行書いた後、「処理を追加しよう」と 2 行目を足しても、その 2 行目は if の中ではなく外として扱われます。インデントが揃っているのでぱっと見では気づきにくく、デバッグに時間を取られる典型例です

if 文の基本で詳しく読む

if (x = 0) と書いてしまう

─ 代入の = と比較の == の混同です。x = 0 は「x0 を代入する」という意味で、条件式としては成り立ちません。Java では boolean を期待する場所に int の代入結果が来るのでコンパイルエラーになり、最近の言語の中では比較的安全です

if 文の基本で詳しく読む

if (x); と書いてしまう

if のカッコの直後にセミコロン ; を置くミスです。これは「条件が true のとき何もしない」という空文として扱われ、その後ろの { }if と無関係なただのブロックになります。文法エラーにならないのでとくに厄介で、コードレビューで指摘されるまで気づかないことすらあります

if 文の基本で詳しく読む

else の前にセミコロン ; を入れる

if (n % 2 == 0) { ... }; のように } の後ろに ; を書いてしまうと、その時点で文が終わってしまい、続く else が孤立してエラーになります。} else { の前に余計な ; を入れない、これが鉄則です

if-else 文で詳しく読む

else に条件を書いてしまう (else if との混同)

else (n > 0) { ... } のように、else の後ろに丸カッコで条件を書こうとする間違いです。条件付きの else を書きたいときは else if (n > 0) { ... } のように else if と書きます。else 単体は条件を取らない、と覚えてください

if-else 文で詳しく読む

%== の優先順位の勘違い

n % 2 == 0 という式は % のほうが == より先に計算される ので、内部的には (n % 2) == 0 と評価されます。心配ならカッコを付けて (n % 2) == 0 と書いてもまったく問題ありません。むしろ可読性が上がるので、慣れないうちはカッコを付けるのもおすすめです

if-else 文で詳しく読む

else if で複数分岐

レッスンを読む

範囲の広い条件を上に書いてしまう

先ほどの grade の例。score >= 60 を一番上に書くと、95 点でも C 判定になります。厳しい条件を上、ゆるい条件を下 が鉄則

else if で複数分岐で詳しく読む

else ifelseif と書く

Java では elseif の 間に半角スペースが必要 です。elseif と続けて書くと ';' expected'else' without 'if' のようなコンパイルエラーになります。Pythonelif とも違うので注意

else if で複数分岐で詳しく読む

最後の else を忘れて return が足りない

ifelse if だけ書いて else を書かないと、戻り値のあるメソッドでは missing return statement のコンパイルエラーになります。最後は else でガッチリ閉じる、または if の外側で return を 1 本用意する

else if で複数分岐で詳しく読む

成績判定プログラム

レッスンを読む

>=> と書いてしまう

90 以上」のつもりで if (score > 90) と書くと、ちょうど 90 点が "A" ではなく "B" に落ちてしまいます。「以上」は >=、「より大きい」は >、と日本語と記号を必ずペアで覚えてください

成績判定プログラムで詳しく読む

条件の順序を逆にしてしまう

if (score >= 60) ... else if (score >= 70) ... のように下から並べると、70 点以上の人もみんな最初の score >= 60 でヒットしてしまい、"D" のままになります。else if チェーンは必ず狭い (厳しい) 条件から書く

成績判定プログラムで詳しく読む

範囲を重複させる

if (score >= 90)else if (score >= 80 && score < 95) のように、範囲が重なる書き方をすると、どちらにヒットするかが順番に依存してしまい、読む人を混乱させます。境界はきっちり閉じる

成績判定プログラムで詳しく読む

else を忘れて漏れを作る

else if (score >= 60) で止めて else を書かないと、50 点のときに "F" を返す経路がなくなり、コンパイラに「missing return statement」と怒られます。多段階の if の最後は必ず else で受ける

成績判定プログラムで詳しく読む

うるう年を判定する

レッスンを読む

%== の優先順位を勘違いする

year % 4 == 0 を「year % (4 == 0)」と解釈してしまう人がいますが、実際は % のほうが == より優先順位が高いので (year % 4) == 0 と評価されます。心配なときは自分で () を付けて意図を明確にしてもよいです

うるう年を判定するで詳しく読む

&&|| の優先順位を取り違える

&&|| より優先順位が高いです。a || b && ca || (b && c) の意味になります。うるう年式で (year % 4 == 0 && year % 100 != 0) のように カッコで囲んでいる のはこの理由で、可読性とミス防止のためにカッコを残すのがおすすめです

うるう年を判定するで詳しく読む

=== の打ち間違い

year % 4 == 0year % 4 = 0 と書くと「year % 40 を代入」しようとしてコンパイルエラーになります。比較は イコール 2 個、代入は イコール 1 個、と暗唱して指に覚えさせてください

うるう年を判定するで詳しく読む

break を忘れる

一番多いミス。case 1: の処理後に break; を書かないと、case 2: のブロックに勝手に流れ込みます。return で抜ける形なら起きませんが、System.out.println(...) などで終わる場合は 必ず break; を最後に書くこと

switch 文で詳しく読む

case の値の型ミスマッチ

switch (day)dayint なのに case "1": と書くと、incompatible types: String cannot be converted to int というエラーが出ます。case の値は switch の式と 同じ型 にする必要があります

switch 文で詳しく読む

default を書き忘れる

戻り値があるメソッドだと missing return statement のコンパイルエラーで気づけますが、void メソッドだと黙って通り抜けてバグの温床になります。default は常に書く習慣を付けましょう

switch 文で詳しく読む

switch 式 (Java 14+) との混同

Java 14 から追加された switch 式 は String s = switch (day) { case 1 -> "Monday"; ... }; のように -> (アロー) を使う新構文です。従来の switch 文 (case ... : + break;) とは別物で、構文を混ぜると ';' expected などのエラーが出ます。このレッスンでは古典的な switch 文の方を使います

switch 文で詳しく読む

三項演算子

レッスンを読む

?: の順番を逆にする

正しいのは 条件 ? 真の値 : 偽の値 の順番です。条件 : 真の値 ? 偽の値 のように書くとコンパイルエラーになります。「クエスチョン (?) が先、コロン (:) が後」と覚えましょう

三項演算子で詳しく読む

ネストして読めなくする

a ? b ? c : d : e ? f : g のような書き方は、構造を理解していてもパッと意味が取れません。3 段以上のネストは避けて if-elseswitch を使う

三項演算子で詳しく読む

両辺の型がずれてコンパイルエラー

? の後と : の後で型が違う (例: n >= 0 ? "正の数" : -n) と、Java は「結果の型がひとつに決まらない」と怒ります。文字列と数値を混ぜないように、両辺の型を必ず揃えましょう

三項演算子で詳しく読む

じゃんけんの勝敗判定

レッスンを読む

条件の網羅性が足りない

勝ちパターンを 2 つしか書かずに残り 1 つを忘れる、引き分けの判定を書き忘れる、といったケースです。テストケースを増やしてあげると、こういった抜けが必ず炙り出されます。先ほどの Mermaid 図のように、すべての分岐を絵にしてから書くと抜けが減ります

じゃんけんの勝敗判定で詳しく読む

||&& の使い間違い

me == 0 || opponent == 1 のように、本来 && で繋ぐべき条件を || で書いてしまうミスです。|| は どちらか片方でも true ならパスしてしまうので、「自分がグー」というだけで勝ち扱いになるなど、判定が壊滅的に狂います。「両方とも成り立つ必要があるなら &&、どれか 1 つでも成り立てばよいなら ||」と毎回声に出して確かめてください

じゃんけんの勝敗判定で詳しく読む

引き分けの検出忘れ

勝ちパターンだけ書いて、勝ちでなかったらすべて "lose" を返してしまうと、janken(1, 1) のような同じ手のときも "lose" になります。me == opponent をどこかで必ず判定する必要があります

じゃんけんの勝敗判定で詳しく読む

FizzBuzz の判定部分

レッスンを読む

判定順序を逆にする

if (n % 3 == 0) return "Fizz"; から書き始めてしまうと、15 のときも "Fizz" が返ってしまい、"FizzBuzz" の出番がなくなります。FizzBuzz (両方の倍数) を 必ず最初に 判定するのが鉄則です

FizzBuzz の判定部分で詳しく読む

String.valueOf を忘れて型エラー

─ 戻り値の型は String なのに、return n; と書いてしまうと「intString として返せません」というコンパイルエラーになります。整数を文字列にしたいときは String.valueOf(n)Integer.toString(n) を使うか、もしくは return "" + n; のように空文字と連結する手もあります

FizzBuzz の判定部分で詳しく読む

% 3 && % 5 のような略記を使う

n % 3 && n % 5 のように書きたくなる人がいますが、これは文法エラーです。&& の左右には boolean が必要なので、必ず n % 3 == 0 && n % 5 == 0 のように == 0 まで 書いてください

FizzBuzz の判定部分で詳しく読む