プログラムを書いて、実行した。
今度はエラーも出ず、ちゃんと動き始めた。
……と思った次の瞬間、
画面に赤い文字が表示される。
「え、さっきまで動いてたのに?」
このときに起きているのが、実行時エラーです。
実行時エラーは、 「実行している途中」で止められるエラー。
Javaが、この状態で続けるのは危険だと判断して、処理を止めます。
実行時エラーとは
実行時エラーは、
- 文法は合っている(コンパイルは通る)
- 実行も始まる
- でも、実行中の状態が想定と違って止まる
こういうタイプのエラーです。
コンパイルエラーとの違いはここです。
- コンパイルエラー:指示の書き方が理解できない(実行前に止まる)
- 実行時エラー:指示は理解できるが、状況が成立していない(実行中に止まる)
つまり、Javaは実行中にこう判断しています。
「このまま続けたら壊れるかもしれない。止めます」
ポケモンで例えると
実行時エラーは、
「指示は通ったけど、状況が成立していない」状態に近いです。
たとえば、
プレイヤー「モンスターボール投げて!」
この指示そのものは正しいですよね。
でも、もし
- 野生ポケモンがいない
- そもそも戦闘に入っていない
そんな状態だったらどうでしょう。
ゲームはそこで止まります。
これは「ルール違反だからダメ」というより、
成立しない状況で無理に続けると、ゲーム自体が壊れかねないから止めている
というイメージです。
Javaの実行時エラーも同じで、
プログラムは正しく書けているのに、実行中の“現実”がズレていると止まります。
代表例:NullPointerException
実行時エラーで、初心者が最も早く、そして高確率で出会うのが
NullPointerException です。
Pikachu pi = null;
pi.attack();
このコードは、文法的には問題ありません。
だから、コンパイルも通るし、実行も始まります。
でも、実行すると次のように止まります。
Exception in thread "main" java.lang.NullPointerException:
Cannot invoke "pokemon_exam.Pikachu.attack()" because "pi" is null
at pokemon_exam.BattleStage.main(BattleStage.java:7)
このエラーが言っていること
NullPointerException を一言で言うなら、これです。
「そこには何もありません」
pi という変数は用意されています。
でも、中身が null です。
つまり、ピカチュウが存在しない状態。
そこに対して attack() を呼んだから、
存在しないものに、処理をさせようとしました
として、Javaが実行中に止めました。
エラー詳細
1). Exception in thread "main" ...
意味:「main という処理の流れ(スレッド)で例外が起きました」
2). java.lang.NullPointerException: ...
意味:「ヌルポ(null参照)です。存在しないものを使おうとしました」
3). Cannot invoke ... because "pi" is null
意味:「pi が null なので、attack() を呼べません」
4). at pokemon_exam.BattleStage.main(BattleStage.java:7)
意味:「場所はここです:BattleStageクラスのmainメソッド、7行目」
なぜ無理やり続けないのか
Javaは、
「たぶんこういう意味だろう」と勝手に解釈して処理を続けません。
もし続けてしまったら、
- どこで壊れるか分からない
- 結果がめちゃくちゃになる
- バグが隠れて、後で地獄を見る
みたいな危険があります。
だからJavaは、
この状態では、これ以上進めません
と判断した瞬間に、処理を中断します。
実行時エラーが出たら、ここを見る
実行時エラーは、書き方の間違いというより、
実行中の「状態」の問題であることが多いです。
まずはここだけ見てください。
- どのファイルか
- 何行目か
そして次に、これを考えます。
「その行を実行したとき、変数の中身はどうなってた?」
チェック観点はこんな感じです。
- 値は本当に入っているか(nullじゃないか)
- 配列の範囲外を読んでないか
- 0で割ってないか
- 想定しない入力(空文字など)になってないか
書き方ではなく、
実行時の変数の中身を見る。
これが、実行時エラーと向き合う第一歩です。
あとがき
ここまで読んでくれて、本当にありがとうございました。
「プログラミングって難しい…」って思ってた人も、
「ちょっと楽しいかも…!」って思ってもらえたらうれしいな。
次の投稿も、よろしくおねがいします。
💬 コメント・フィードバック歓迎!
「この章わかりやすかった!」
「これ表現まちがってない?」
「次は○○をやってほしい!」などなど、
お気軽にコメントで教えてくださいね!
