
🟢 はじめに
Javaの勉強中、またはJava Silverの試験対策中に、こんなコードに出会ったことはありませんか?
一見すると普通の計算に見えますが、実はコンパイルエラーになってしまう「ひっかけ」が潜んでいます。
今日は、なぜエラーになるのかを「カメレオン」と「頑固職人」の例え話で、初心者向けに分かりやすく解説したいと思います☕️
罠が潜むコード
まずは、RPGゲームのステータス表示をイメージしたこちらのコードを見てみましょう。
public class CalculationTrap { public static void main(String[] args) { // パターン①:HPの計算? System.out.println("HP: " + 100 + 50); // パターン②:スコアの計算? System.out.println("Score: " + 10 + 5 * 2); // パターン③:ダメージ計算?(💥ここでエラー発生!) System.out.println("Damage: " + 100 - 20); } }
実はこのプログラム、3つ目のDamageの行でコンパイルエラーになってしまいます。
なぜなのか、Javaの「3つのルール」を知るとスッキリ理解できるようになると思います。
🌟 覚えておきたい3つのルール(キャラクター紹介)
1. 「+」は周りに合わせる【カメレオン🦎】
数字と数字の間にいるときは「電卓🧮(足し算)」として働きます。
しかし、片方に「文字列(文字)」がいると、途端に「のり(文字をくっつける)」に変身します。
一度「のり」でくっついた数字は、もう「文字」として扱われます。
2. 「*」「/」は特別扱いの【VIP客👑】
Javaの計算は基本的に「左から右」へ進みますが、掛け算(*)と割り算(/)はVIPです。
行列を無視して真っ先に計算されます。
3. 「-」は計算しかしない【頑固な電卓🧮】
「+」のように「のり」には絶対になれません。
純粋な数字同士の引き算しかできない頑固職人です。
📝 1行ずつコードを謎解き
それでは、ルールを思い出しながらコードを解読してみましょう。
パターン①:"HP: " + 100 + 50
ここは基本通り、左から順番に処理されます。
"HP: " + 100
➡️ 左側が文字なので、「+」はのりに変身!"HP: 100"という文字列になります。"HP: 100" + 50
➡️ また左側が文字なので、これものりでくっつきます。【結果】
HP: 10050(※150にはなりません!)
パターン②:"Score: " + 10 + 5 * 2
まずはVIP客👑の掛け算が優先!
5 * 2が先に計算されて10になります。 (今の状態:"Score: " + 10 + 10)次に左から処理します。
"Score: " + 10がのりでくっつき"Score: 10"になります。最後に
"Score: 10" + 10。これも文字と数字なのでくっつきます。【結果】
Score: 1010
パターン③:"Damage: " + 100 - 20 💥エラー!
左から処理します。
"Damage: " + 100がのりでくっつき"Damage: 100"(文字列)になります。
(今の状態:"Damage: 100" - 20)次に文字列から
20を引こうとしますが……【エラー発生🚨】
ここで「-」の登場です。「-」は頑固な電卓なので、「言葉から数字は引けないよ!」とJavaが怒ってしまい、コンパイルエラーになります。
✍️ まとめ
掛け算・割り算は先に計算される
文字列に「
+」で繋がれた数字は、足し算ではなく「文字の連結」になる文字列に対して「
-」を使おうとするとコンパイルエラーになる
Java Silverの試験でも、この「左から順番に文字化していく罠」は頻出だと言われています。
Java学習中の方の参考になれば幸いです🙌