In a nutshell
エラー対処は論理的アプローチが重要だが,直感的なパターン認識も有効である.
本記事では,エラーの兆候ごとに疑うべき原因を整理し,迅速なデバッグを支援する.
言語ごとの特有のエラーも網羅し,環境依存の問題にも対応できるようにまとめた.
はじめに
エラーへの対処は論理的に行う必要がある.ロジックやアーキテクチャからエラーの原因を導くことが重要であるのは自明だが,全てのケースに十分な時間を割くことは難しい.
そこで,「このパターンのときには,この原因を疑う」という直感的なエラー対処の指針を持つことが有用である.ケースバイケースであり,誤りでも構わないが,迅速なデバッグの助けとなる洞察を得られる.
以下に,具体的なエラーの兆候と,それに対応する疑うべき原因をまとめる.
エラーハンドリングの基本原則
- 再現手順の確認: どの入力や環境でエラーが発生するか特定する.
- ログの活用: エラーメッセージやスタックトレースを記録し,原因を特定する.
- 最小限のコードで再現: 問題の箇所を切り出し,シンプルな形で確認する.
- 例外処理の適用:
try-catch
(Pythonならtry-except
)を活用し,適切にエラーを処理する. - 環境・バージョンの確認: OSやライブラリの違いによる影響をチェックする.
- 仮説と検証を繰り返す: 修正を試し,同じエラーが再現するか検証する.
直感的なエラー対処パターン
出力が "0x..." のようなアドレス表記
疑うべき原因: メモリ関連の問題 や 存在しない箇所へのアクセス
具体例:
-
segmentation fault
->nullptr
参照や解放済みメモリのアクセス -
0xC0000005 (Access Violation)
-> Windows環境での不正メモリアクセス -
std::bad_alloc
-> メモリ不足や無限ループによる過剰なメモリ確保
出力が "nan" や "inf"
疑うべき原因: 数値計算エラー
具体例:
- 0除算 (
x / 0
) - ルートの中に負の数 (
sqrt(-1)
) - 浮動小数点のオーバーフロー (
exp(1000)
) -
log(0)
,1/0
,atan2(0, 0)
ファイルパス関連のエラー
疑うべき原因: 権限,パスの違い,環境依存
具体例:
-
FileNotFoundError
-> 相対パスとカレントディレクトリを確認 -
Permission denied
-> OSの権限や管理者権限をチェック -
IsADirectoryError
-> ディレクトリの指定ミス
処理が途中で止まる (無限ループ or ハング)
疑うべき原因: 無限ループ,デッドロック
具体例:
-
while (true)
で抜け出す条件がない -
mutex.lock()
したままunlock()
していない - マルチスレッドで
join()
の順番が間違っている
特定の環境だけで動かない
疑うべき原因: OS依存,ライブラリのバージョン違い
具体例:
- WindowsとLinuxで改行コード (
\r\n
vs\n
) - Pythonのバージョン (
3.7
では動くが3.11
では動かない等) - CUDAのバージョンが違うため GPU が認識されない
エラーが出ないが期待通りの動作をしない
疑うべき原因: 変数の上書き,スコープミス,初期化忘れ
具体例:
-
int x; cout << x;
-> 未初期化の変数 -
if (a = 10)
->=
の誤使用 (==
ではなく=
を使ってしまった) -
global_variable
がローカル変数で上書きされる
特定の入力だけでエラーが発生する
疑うべき原因: 境界条件,例外処理漏れ
具体例:
- リストの末尾アクセス (
arr[arr.size()]
) - 負の数やゼロが入った場合の処理 (
1/x
やsqrt(x)
) - JSON のキーが存在しない (
dict["key"]
でKeyError
)
特定のOSでビルドが通らない
疑うべき原因: 環境変数,パスの違い,コンパイラ依存
具体例:
-
g++
では動くがMSVC
では動かない -
#include <unistd.h>
が Windows でエラー -
make
コマンドが Windows ではmingw32-make
特定の言語に由来するエラー
Vue.jsで特徴的なエラー
疑うべき原因: コンポーネントのライフサイクル,データバインディング,依存関係の管理
具体例:
-
Cannot read property of undefined
->data()
で定義していない変数を参照 -
Property or method is not defined
-> Vueインスタンスに登録されていない関数や変数を使用 -
Vue warn: Error in render function
-> テンプレートで存在しない変数を参照
Pythonで特徴的なエラー
疑うべき原因: インデントミス,型の不一致,モジュールのインポート
具体例:
-
IndentationError: unexpected indent
-> インデントが不正 -
TypeError: unsupported operand type(s)
-> 文字列と数値を加算しようとした -
ModuleNotFoundError
-> インストールされていないモジュールをインポートしようとした
Node.jsで特徴的なエラー
疑うべき原因: 非同期処理,モジュールのロード,環境設定
具体例:
-
Cannot find module
->require()
で指定したモジュールが見つからない -
UnhandledPromiseRejectionWarning
->async/await
のエラーハンドリング不足 -
EADDRINUSE
-> 使用済みのポートでサーバーを起動
C++で特徴的なエラー
疑うべき原因: ポインタの誤使用,未定義動作,コンパイル時の型不一致
具体例:
-
Segmentation fault (core dumped)
->nullptr
の参照,未確保のメモリへのアクセス -
std::bad_alloc
-> メモリ不足によるnew
失敗 -
error: no matching function for call to
-> 関数のオーバーロードやテンプレートの型不一致 -
undefined reference to
-> ヘッダのみの関数を定義し忘れた,リンカエラー
Javaで特徴的なエラー
疑うべき原因: クラスとオブジェクトの管理,例外処理,型の厳格なチェック
具体例:
-
NullPointerException
->null
のオブジェクトメンバを参照 -
ClassCastException
-> 型変換の失敗(例:String
をInteger
にキャスト) -
ArrayIndexOutOfBoundsException
-> 配列の範囲外アクセス -
NoClassDefFoundError
-> クラスがコンパイル済みだが実行時に見つからない
Rustで特徴的なエラー
疑うべき原因: 所有権の管理,型の厳密性,コンパイル時チェックの強化
具体例:
-
error[E0382]: borrow of moved value
-> 所有権が移動した値を再利用 -
thread 'main' panicked at
->unwrap()
でNone
やErr
を取得 -
expected struct, found reference
-> 参照と所有値のミスマッチ -
cannot borrow as mutable
-> 可変借用の制約違反
Kotlinで特徴的なエラー
疑うべき原因: Null Safety,Coroutine の誤用,型システムの制約
具体例:
-
kotlin.KotlinNullPointerException
->!!
を使用してnull
を強制アンラップ -
Unresolved reference: X
-> 変数がスコープ内にない -
IllegalStateException: coroutine scope has been cancelled
->Coroutine
のキャンセル後に処理を続けようとした -
lateinit property X has not been initialized
->lateinit
の変数を初期化前に参照
Summary
- エラーハンドリングの基本原則: 再現手順・ログの確認,最小限のコードでの検証が鍵
- 直感的なエラー対処パターン: メモリ・数値計算・ファイル・無限ループ・環境依存などの分類
- 特定の入力や環境でのみ発生するエラー: 境界条件,OSやバージョン差異を考慮する
- 言語別のエラー: Vue.js, Python, Node.js, C++, Java, Rust, Kotlinの主要エラーと対処法を整理
- 環境依存のエラー: WindowsとLinuxの違い,ライブラリのバージョンによる影響を解説
- 迅速なデバッグのための指針: ケースごとに疑うべきポイントを把握し,仮説検証を繰り返す