Menu
Coddy logo textTech

実行時エラー(ランタイムエラー)とは?

ランタイムエラー(実行時エラー)とは、プログラムの実行中に、手元の値では処理を実行できないときに起きるエラーのことです。ゼロ除算やリストの末尾を超えた読み取りが典型例です。エラーを処理しない限り、プログラムはその行で停止します。

執筆: Kevin Spektor, 共同創業者、CTO

更新日: 2026年9月24日

実行時エラー(ランタイムエラー)は、プログラムが動き始めてから姿を現します。コードは開始前のチェックをすべて通過し、しばらくは正しく動き、そしてその時点の値では実行できない処理に到達します。次の関数は、あるリストではうまく動き、別のリストでは失敗します。

85.0
Traceback (most recent call last):
  File "main.py", line 5, in <module>
    print(average([]))
          ^^^^^^^^^^^
  File "main.py", line 2, in average
    return sum(scores) / len(scores)
           ~~~~~~~~~~~~^~~~~~~~~~~~~
ZeroDivisionError: division by zero

1回目の呼び出しは 85.0 を表示します。2回目は空のリストを渡しているので、len(scores) が0になり、割り算ができません。文法にはどこも問題がないので、これは構文エラーではありません。問題は特定のデータのときにだけ存在します。だからこそ、実行時エラーは100回正しく動いたプログラムにも現れることがあるのです。

実行時エラーが起きると何が起こるのか

  1. プログラムがある処理に到達します。ここでは sum(scores) / len(scores) です。
  2. ランタイムは実行する前にその処理をチェックします。CPythonは割り算の前に除数を調べ、JVMは配列のインデックスをすべてチェックし、Pythonは辞書の値を返す前にキーが存在するかを確かめます。
  3. チェックに失敗すると、ランタイムはエラーオブジェクトを作ります。PythonとJavaではこのオブジェクトが例外で、エラーの種類、メッセージ、発生した場所を記録しています。
  4. ランタイムはその種類のエラーを処理するコードを探します。まず現在の関数の中、次にその関数を呼び出した関数の中、というように外側へ向かって探します。
  5. 処理するコードがなければ、プログラムは停止します。Pythonはトレースバックを表示して終了ステータス1で終わります。Javaは Exception in thread "main" で始まるスタックトレースを表示します。

こうしたチェックがない言語では、振る舞いが異なります。Cは配列のインデックスもポインタもチェックしないので、不正なメモリアクセスは黙ってデータを壊すか、オペレーティングシステムがセグメンテーション違反でプログラムを終了させるかのどちらかになります。

失敗した行より前にプログラムが行ったことは、すべてすでに実行済みです。次のループは3つの色を表示してから、4回目で失敗します。

red
green
blue
Traceback (most recent call last):
  File "main.py", line 4, in <module>
    print(colors[i])
          ~~~~~~^^^
IndexError: list index out of range

トレースバックの読み方

Pythonのトレースバックは下から上に読みます。最後の行にはエラーの種類とメッセージが書かれています(ZeroDivisionError: division by zero)。その上の行は呼び出しの連鎖で、古いものが先、最新のものが最後に並びます。最初の例では、5行目が average を呼び出し、average の中の2行目で割り算が失敗しています。

エラーが起きた行が、直すべき行とは限りません。average の2行目は正しいのです。本当の問題は、なぜ空のリストがそこに届いたのかです。おかしな値をその出どころまでたどり、そこで直してください。自分で書いていないライブラリのファイルをトレースバックが通っている場合は、自分のファイルを指している最後の行を探します。

よくある実行時エラー

以下のメッセージはどれもPython 3.12からそのまま写したものです。

エラー例メッセージ
ZeroDivisionError10 / 0division by zero
IndexError["red", "green", "blue"][3]list index out of range
KeyError{"theme": "dark"}["font"]'font'
ValueErrorint("twenty")invalid literal for int() with base 10: 'twenty'
TypeError"Total: " + 5can only concatenate str (not "int") to str
AttributeErrorNone に対して .upper() を呼ぶ'NoneType' object has no attribute 'upper'
FileNotFoundErroropen("missing.txt")[Errno 2] No such file or directory: 'missing.txt'
RecursionError自分自身を永遠に呼び続ける関数maximum recursion depth exceeded

Javaにもそのまま対応するものがあります。ArithmeticException、ArrayIndexOutOfBoundsException、NumberFormatException、NullPointerException などです。誰も捕捉しない整数のゼロ除算は、Javaでは次のように表示されます。

Exception in thread "main" java.lang.ArithmeticException: / by zero

JavaScriptは数値に関しては寛容で、10 / 0 はエラーではなく Infinity になります。失敗するのは、存在しない値を使ったときです。user が undefined のときに user.name を読むと、Node.jsは次のように表示します。

TypeError: Cannot read properties of undefined (reading 'name')

実行時エラーの直し方

  1. 再現します。同じ入力でプログラムをもう一度実行し、同じエラーが出ることを確認します。
  2. トレースバックの最後の行を読み、自分のコードの中で対応する行を見つけます。
  3. 関係する値を調べます。失敗する行の直前で値を表示するか、デバッガのブレークポイントでそこで止めます。
  4. 原因を直します。インデックスを修正する、特別なケースを先に処理する、使う前に入力を検証する、といった方法です。

average 関数の場合は、スコアが1つもないときの平均をどうするかを決め、それをコードに書くのが修正方法です。

85.0
0

自分ではどうにもできない失敗もあります。削除されたファイル、タイムアウトするネットワーク、数字を入れるべきところに文字を入力するユーザーなどです。こうしたものはコードを直しても防げないので、例外処理で捕捉し、プログラムが次に何をするかを決めます。やってはいけないのは、バグを try で包んで隠すことです。1回多く数えてしまうループから出た IndexError は、捕捉すべきエラーではなく、直すべき誤りです。

WindowsやExcelに出る実行時エラーのメッセージ

この言葉は、自分のコード以外の場面でも目にします。Microsoft Visual C++ Runtime Library というタイトルのWindowsのダイアログに Runtime Error! と表示された場合、C++で書かれたプログラムが致命的なエラーに遭遇し、C++のランタイムがそれを終了させたという意味です。ユーザーとしてはそのコードを変更できないので、プログラムを更新する、Microsoft Visual C++ 再頒布可能パッケージを修復または再インストールする、ゲームであればグラフィックドライバを更新する、といった対処が一般的です。

VBAで書かれたExcelのマクロは、番号付きの実行時エラーを報告します。Run-time error '9': Subscript out of range は、存在しないワークシートや配列の要素をマクロが要求したという意味で、Run-time error '1004' は、ブック、シート、セル範囲に対する操作が失敗したときに出る一般的なエラーです。考え方はPythonと同じで、正しいコードが処理できない値に出会ったということです。

次に読むページ

実行時エラーには2つの仲間がいます。プログラムの開始前に見つかる構文エラーと、メッセージをまったく出さない論理エラーです。クラッシュする代わりに実行時エラーから回復するには、例外処理を読み、続けてPythonの例外とエラーのデバッグのガイドを読んでください。Pythonコースでは、毎回のレッスンでこのようなコードを書いて直していきます。

よくある質問

実行時エラーと構文エラーの違いは?
構文エラーは、コードが言語の文法に違反しているため、プログラムが始まる前に見つかり、1行も実行されません。実行時エラーはその後、プログラムの実行中に、正しい行が処理できない値に出会ったときに起きます。それより前の行はすでに実行されており、出力を表示していることもあります。
なぜ実行時エラーが何度も出るのですか?
たいていは、コードがデータについて、常に成り立つとは限らない前提を置いているからです。リストは空にならない、ファイルは存在する、ユーザーは数字を入力する、といった前提です。どの前提も、テストした入力ではうまくいき、テストしなかった入力で失敗します。空、ゼロ、欠けている値、非常に大きな値でテストし、そうしたケースを明示的にチェックするか処理してください。
LeetCodeの「Runtime Error」はどういう意味ですか?
解答はコンパイルできたものの、少なくとも1つのテストケースでクラッシュしたという意味です。よくある原因は、範囲外のインデックス、ゼロ除算、null や None の値の使用、スタックがあふれるほど深い再帰です。結果ページに表示された失敗した入力を自分で実行し、空の配列、要素1つ、許される最大サイズといった境界ケースを確認してください。
実行時エラーと例外は同じものですか?
完全に同じではありません。PythonやJavaでは、ほとんどの実行時エラーが例外として報告され、そのおかげでプログラムがそれを捕捉できます。しかしCのような言語には、実行時エラーはあっても例外はまったくありません。またJavaでは、RuntimeException は特定の例外のグループ、つまり NullPointerException のような非チェック例外の名前でもあります。
コンパイラは実行時エラーを見つけられますか?
一部だけです。コンパイラやmypyのような型チェッカーは、数値に文字列を足すといった特定の誤りが起こり得ないことを証明できます。しかし、ユーザーが入力した数値が実はゼロだった、というようにプログラムの実行中に届く値までは知りようがありません。そうしたエラーは、コードを実行して見つけるか、入力をチェックして処理するしかありません。
Coddy programming languages illustration

Coddyでコードを学ぼう

始める