ヌルポインタ例外

配達員に住所が書かれていない白紙のメモを渡して、「ここに荷物を届けて!」と頼んでしまったときに起こるトラブルのようなものです。

定義 ヌルポインタ例外(NullPointerException)とは、プログラムが何も指していない空っぽのメモリアドレス(Null)を参照し、その中にあるデータや機能を使おうとしたときに発生する致命的な実行時エラーです。

住所のない白紙のメモでお使いを頼むとどうなる?

コンピュータにとって「変数」とは、物の場所が書かれたメモ用紙やアドレス帳のようなものです。例えばスマートフォンの連絡先一覧で友達の名前をタップすると、コンピュータはその名前に紐づいた電話番号メモを読み取って電話をかけます。

しかし、友達の名前は登録されているものの、肝心の電話番号欄が「空っぽ(Null)」のままだったらどうなるでしょうか? その状態でコンピュータに「電話をかけて!」と無理に命令すると、コンピュータは存在しない番号に発信しようとしてパニックを起こし、動作をストップしてしまいます。

ここで「ポインタ」とはメモリ内の特定データの場所を指差す指であり、「ヌル(Null)」は何もないことを意味します。つまり、何もない虚空を指差している指に向かって「そこにある物を取ってきて!」と命じるようなものです。メモ用紙(変数)は手にあるのに、そこに書かれているはずの実際の中身(オブジェクト)が完全に空っぽな状態なのです。

NPE概念図 友人の名前 番地:nul 変数 (名札) 例外発生! データなし 実メモリ(生成体)

アプリが突然クラッシュして落ちる本当の理由

スマホのアプリを使っていて、何の前触れもなく突然アプリが落ちてホーム画面に戻ってしまった経験は誰にでもあるはずです。私たちが普段遭遇するアプリの強制終了(クラッシュ)の多くは、まさにこのエラーが原因で起こっています。

例えば、電波状況が悪くてサーバーからアイコン画像やコメントのデータを正常に取得できなかったとします。手元にデータがない状態なのに「画面に表示しろ」と命令されると、コンピュータは空っぽの空間を無理やり開こうとしてエラーを起こします。

あらかじめ対策を用意していないと、プログラムはそれ以上先のコードを実行できずにその場で力尽きてしまいます。そのため開発者は、データを扱う前に「中身が空っぽではないか?」とあらかじめ確認する事前チェック(Nullチェック)をコードの中にしっかりと組み込む必要があるのです。

もう少し詳しく:歴史上名高い「10億ドルの誤り」

コンピュータプログラミングの歴史において、Nullという概念には非常に有名な逸話があります。1965年、イギリスの著名な計算機科学者トニー・ホーア(Tony Hoare)氏は、「値が存在しない状態」を手軽に表現するためにNull参照を初めてプログラミング言語に導入しました。

しかし数十年後、彼は自身の発明を振り返り、公の場で「10億ドルの誤り(The Billion Dollar Mistake)」だったと告白しました。Nullを許容したせいで世界中のソフトウェアで無数のシステム障害やセキュリティ上の欠陥が生じ、その修正に天文学的なコストがかかってしまったからです。

近年の最新プログラミング言語は、この長年の苦しみから脱却するために賢い安全装置を標準装備しています。変数にNullが入り得るかどうかをコードを書く段階から厳しくチェックする「Null安全(Null Safety)」という仕組みが、現代のソフトウェア開発におけるスタンダードになりつつあります。

🤔 よくある誤解

✕ 誤解

Nullは数字の「0」や空の文字列("")と全く同じ意味である。

✓ 事実

数字の0には「0という値」があり、空文字も「長さが0の文字列」という実体が存在します。しかしNullは、メモリ上に割り当てられた対象そのものが存在しない「完全な無(不在)」を意味します。

🧺 日常で出会う場面

1 ログインしていない訪問者のユーザー情報からニックネームを取得しようとしたとき。
2 掲示板ですでに削除された投稿の本文テキストを画面に表示しようとしたとき。
💡 つまり ひとことで

何も存在しない空っぽのメモリアドレスを参照し、データを取り出そうとしたときに発生するコンピュータの代表的なエラーです。