定義
ヌルポインタ例外(NullPointerException)は、プログラムが何も指していない参照(Null)を通してデータや機能を使おうとしたときに起こる、実行中のエラーです。Javaなどの言語で使われる名前で、きちんと処理しなければプログラムが止まってしまいます。
空っぽの宛先でおつかいに出すと起こること
コンピューターの変数は、物の場所が書かれたメモや住所録のようなものです。たとえばスマホの連絡先リストで友だちの名前をタップすると、コンピューターはその名前に結びついた電話番号のメモを読み取って、電話をかけます。
でも、友だちの名前はリストに登録されているのに、肝心の電話番号の欄が「空っぽ(Null)」だったらどうなるでしょう? その状態でコンピューターに通話ボタンを押せと命令すると、コンピューターは存在しない番号を押そうとして大慌てになり、動かなくなってしまいます。
ここで「ポインタ」は、メモリ上の特定のデータの場所を指す指で、「ヌル」は何もないことを意味します。つまり、空中を指している指に向かって、物を取ってこいと命じているようなものです。紙(変数)は手に持っているのに、紙に書かれた実際の中身(オブジェクト)が空っぽ、という状況ですね。
アプリが突然落ちる本当の理由
スマホのアプリを使っていて、警告も出ないまま画面が突然消えたり、ホーム画面に飛ばされたりした経験が、一度はあるはずです。こうしたアプリの強制終了のよくある原因のひとつが、このエラーです。
たとえば、ネット接続が不安定で、サーバーからプロフィール写真やコメントのデータをうまく受け取れなかったときがあります。用意されたデータがないのに画面に絵を描くよう命令すると、コンピューターは空っぽの場所を無理やり開こうとしてエラーを起こします。
あらかじめ対策をしておかないと、プログラムはそれ以上次のコードを実行できず、その場で倒れてしまいます。だから開発者は、データを扱う前に「もしかして値が空なのでは?」とまず確かめる事前チェックのコード(Nullチェック)を、丁寧に書く必要があるのです。
もう少し正確に言うと:10億ドルの失敗
コンピューターのプログラミングの歴史で、ヌル(Null)という概念には、とても有名なエピソードがあります。1965年、イギリスの著名なコンピューター科学者トニー・ホーア(Tony Hoare)は、「値が存在しない状態」を手軽に表すために、ヌル参照を初めてプログラミング言語に取り入れました。
しかし数十年後、彼は自分の発明を10億ドル規模の大きな失敗だったと、公の場で打ち明けました。ヌル値を許したせいで、世界中のソフトウェアで数えきれないほどのクラッシュやセキュリティ上の欠陥が生まれ、その修正に天文学的な費用がかかったからです。
KotlinやSwiftなど多くの新しいプログラミング言語は、この長年の苦しみから抜け出すために、賢い安全装置を最初から備えています。変数に空の値が入りうるかどうかを、プログラマーがコードを書く段階から厳密に問うヌル安全性(Null Safety)の手法が、少しずつ広まっています。
よくある誤解
Nullは数字の0や空文字("")とまったく同じ意味だ。
数字の0は「0という値」が存在し、空文字も「長さが0の文字列」という実体がありますが、Nullはメモリに割り当てられた対象すらない「完全な不在」を意味します。
日常で出会う場面
ログインしていない訪問者の情報からニックネームを取り出そうとしたときに起こります。
掲示板で、すでに削除された投稿の本文テキストを画面に表示しようとしたときに起こります。
つまり ひとことで
何も指していない参照からデータを取り出そうとしたときに起こる、代表的なプログラミングのエラーです。