5
3

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

【ポケモン×Java】知識編 ERROR #3 実行時エラーって何?

Posted at

プログラムを書いて、実行した。
今度はエラーも出ず、ちゃんと動き始めた。

……と思った次の瞬間、
画面に赤い文字が表示される。

「え、さっきまで動いてたのに?」

このときに起きているのが、実行時エラーです。
実行時エラーは、 「実行している途中」で止められるエラー。
Javaが、この状態で続けるのは危険だと判断して、処理を止めます。

実行時エラーとは

実行時エラーは、

  • 文法は合っている(コンパイルは通る)
  • 実行も始まる
  • でも、実行中の状態が想定と違って止まる

こういうタイプのエラーです。

コンパイルエラーとの違いはここです。

  • コンパイルエラー:指示の書き方が理解できない(実行前に止まる)
  • 実行時エラー:指示は理解できるが、状況が成立していない(実行中に止まる)

つまり、Javaは実行中にこう判断しています。

「このまま続けたら壊れるかもしれない。止めます」

ポケモンで例えると

実行時エラーは、
「指示は通ったけど、状況が成立していない」状態に近いです。

たとえば、

プレイヤー「モンスターボール投げて!」

この指示そのものは正しいですよね。

でも、もし

  • 野生ポケモンがいない
  • そもそも戦闘に入っていない

そんな状態だったらどうでしょう。

ゲームはそこで止まります。

これは「ルール違反だからダメ」というより、
成立しない状況で無理に続けると、ゲーム自体が壊れかねないから止めている
というイメージです。

Javaの実行時エラーも同じで、
プログラムは正しく書けているのに、実行中の“現実”がズレていると止まります。


代表例:NullPointerException

image.png

実行時エラーで、初心者が最も早く、そして高確率で出会うのが
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で割ってないか
  • 想定しない入力(空文字など)になってないか

書き方ではなく、
実行時の変数の中身を見る。

これが、実行時エラーと向き合う第一歩です。

あとがき

ここまで読んでくれて、本当にありがとうございました。

「プログラミングって難しい…」って思ってた人も、
「ちょっと楽しいかも…!」って思ってもらえたらうれしいな。

次の投稿も、よろしくおねがいします。

💬 コメント・フィードバック歓迎!

「この章わかりやすかった!」
「これ表現まちがってない?」
「次は○○をやってほしい!」などなど、
お気軽にコメントで教えてくださいね!


5
3
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
5
3

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?