
🟢 はじめに
Javaの勉強をしていると、「あれ?なんでこれエラーになるの?」と首を傾げたくなる場面があると思います。
特にJava Silverなどの資格試験では、「文法チェックではじかれるエラー(コンパイルエラー)」と、「動かした後に爆発するエラー(実行時エラー)」の引っかけ問題がよく出題されると言われています。
今回は、私がJava学習中に「なるほど!」と腑に落ちた、3つの重要なポイントを例え話を交えて解説したいと思います。
1. 文字列専用の翻訳ロボットに「本物の数字」を渡してはいけない
Javaには、文字を数字に変換してくれる便利なメソッドがたくさんあります。
その一つが Double.parseDouble() です。
まずは、以下のコードを見てみてください。
どこが間違っているでしょうか?
// ❌ コンパイルエラーになるコード double weight = Double.parseDouble(65.5);
一見すると、「65.5という数字をdouble型(小数)の変数に入れているだけ」に見えますよね。
でも、これはコンパイルエラー(文法エラー)になって、実行すらできません!
🤔 なぜエラーになるのか?
Double.parseDouble() という命令は、「文字列(String)のデータ」を受け取って「小数(double)のデータ」に変換するための専用ツールだからです。
正しい使い方: Double.parseDouble("65.5"); ("で囲んで文字列として渡す)
間違った使い方: Double.parseDouble(65.5); (小数の数値を直接渡す)
☕️ 例え話: このメソッドを「文字で書かれた数字」を「計算用の本物の数字」に翻訳してくれる専用ロボットだと想像してみてください。
最初から「本物の数字(65.5)」を渡してしまうと、ロボットは「私は文字のメモ用紙しか受け取れない設定です!これは処理できません!」とパニックを起こして停止してしまいます。
2. 恐怖の「実行時エラー」!文法は合っているのに動かない罠
次は、文字列の中から特定の文字を取り出す charAt() メソッドの罠です。
以下のコードは、コンパイルエラーになるでしょうか?
// ⚠️ コンパイルエラーにはならないが、実行するとエラーになるコード String petName = "Cat"; char initial = petName.charAt(5);
実はこれ、コンパイル(文法チェック)は無事に通過してしまいます。
しかし、いざプログラムを実行すると StringIndexOutOfBoundsException というエラーを吐いて強制終了します(これが実行時エラーです)。
🤔 なぜコンパイルエラーにならないのか?
charAt(5) は「5番目(※0から数えるので実質6文字目)の文字を取り出してね」という命令です。
"Cat" は3文字しかありません。
☕️ 例え話: レストランでメニューを見ながら「裏メニューの5番目を持ってきて」と注文する状況を想像してみてください。
「注文すること」自体は日本語の文法として間違っていないので、店員さんは注文を受け付けます(=コンパイル通過)。
しかし、いざ厨房に行って確認すると「うちのメニュー、3番目までしかないよ!」とパニックになり、料理は出てきません(=実行時エラー)。
3. 意外と優しい?大文字・小文字を気にしない変換メソッド
最後に、文字列を boolean(true か false)に変換する Boolean.parseBoolean() メソッドの面白い性質を紹介します。
// 正しく変換されるコード boolean isOk = Boolean.parseBoolean("TrUe"); System.out.println(isOk); // 結果は true と表示される
文字列の "TrUe" と、大文字・小文字がぐちゃぐちゃに混ざっていますよね。
普通ならエラーになりそうですが、実はこれ、正常に true に変換されます。
🤔 なぜちゃんと変換されるのか?
parseBoolean メソッドは、受け取った文字列が「true(大文字小文字問わず)」であれば true を返し、それ以外の文字列(例えば "false" や "cat" など)はすべて false を返すという、とても寛容な性質を持っています。
☕️ 例え話: イベント会場の受付スタッフを想像してみてください。
参加証に「TRUE」「true」「TrUe」とどんな書き方で書かれていても、「あ、これはTrueさんですね、どうぞ!」と柔軟に笑顔で通してくれる、とても優しいスタッフです。
Javaの文法チェッカー(コンパイラ)は、「Stringに対してcharAtを使うのは文法的にOK!」と判断しますが、中身の文字数までは動かしてみるまで確認しません。
📝 まとめ
Double.parseDouble()には、必ず "文字列" を渡すこと!charAt()で存在しない文字数を指定すると、コンパイルは通るのに "実行時エラー" になるので注意!Boolean.parseBoolean("tRUE")は、大文字小文字を無視して "true" に変換してくれる!
Java Silverの試験では、この「コンパイルエラー」か「実行時エラー」かを見極めることが重要だと言われています。
Java学習中の方の参考になれば幸いです🙌