🟢 はじめに
Javaの学習をしていると、文法的には間違っていないのに「思っていた動きと違う!」というバグに遭遇することがあります。
今回は、Java Silverの試験によく出ると言われている「波括弧 { } を省略した if 文の罠」について、RPGの勇者の冒険に例えながら解説します!
💻 サンプルコード
勇者の現在の「HP(体力)」をチェックして、メッセージを表示するプログラムを書いてみました。
以下のコードを実行すると、コンソールには何が表示されるでしょうか?
public class RpgTrap {
public static void main(String[] args) {
int hp = 5;
// ① 正常な if文(HPが10未満なら警告)
if (hp < 10) {
System.out.println("HPがピンチです!回復してください!");
}
System.out.println("現在のHP: " + hp);
// ② 罠が仕掛けられた if文(HPが10より大きければ安全を知らせる...?)
if (hp > 10)
System.out.println("HPは十分にあります。");
System.out.println("さあ、次のボスに挑みましょう!");
}
}
勇者のHPは 5 です。
下の②の if 文の条件(HPが10より大きいか)は満たしていないので、「メッセージは何も表示されない」ように見えますよね?
しかし、実際の実行結果はこうなります👇
HPがピンチです!回復してください!
現在のHP: 5
さあ、次のボスに挑みましょう!
「え!?HPがピンチなのに、次のボスに挑もうとしてる!?」
一体なぜ、こんな無謀な勇者になってしまったのでしょうか?
罠の正体:インデント(字下げ)の幻術
このバグの原因は、②の if 文に波括弧 { }(ブロック)がないことです。
Javaの世界には、次のような絶対のルールがあります。
💡 波括弧 { } のない if文は、直後の「1行(1コマンド)」しか支配できない!
つまり、コンピューターの目線から先ほどのコードを見ると、実はこのように見えているのです。
// 勇者のHPは 5
if (hp > 10) {
// もしHPが10より大きければ、この1行だけ実行する(今回はスキップされる)
System.out.println("HPは十分にあります。");
}
// ⚠️ここから下は、if文とは全く無関係に表示されます。
System.out.println("さあ、次のボスに挑みましょう!");
コードを書いた人は、インデント(字下げ)を揃えることで「2行とも if文の仲間だよ」と見せかけていたつもりかもしれません。
しかし、Javaのコンパイラ(システム)はインデントの見た目を一切気にしません。
波括弧 { } で囲まれていないため、if 文の影響力は直後の1行で途切れてしまいます。
その結果、最後の行の「さあ、次のボスに挑みましょう!」は、if文の条件とは一切関係なく、誰でも必ず通るただの道になってしまい、強制的に実行されてしまったのです。
🛡️ 冒険の鉄則(ベストプラクティス)
このような「見た目の幻術」によるバグは、後から見つけるのがとても大変です。
この罠を完全に防ぐための、プログラマーとしての「最強の盾」があります。
それは、「処理が1行だけでも、必ず波括弧 { } を書くこと」です!
// 常に { } を書くクセをつけましょう!
if (hp > 10) {
System.out.println("HPは十分にあります。");
System.out.println("さあ、次のボスに挑みましょう!");
}
たったこれだけで、意図しないバグを防ぐことができます。
📝 まとめ
-
if文に波括弧{ }がないと、影響するのは直後の1行だけ! -
インデント(字下げ)を揃えても、Javaはそれをブロックとしては認識してくれない。
-
処理が1行だけでも、省略せずに
{ }を書くのが安全なプログラミングの鉄則!
Java学習中の方の参考になれば幸いです🙌