NullPointerException単語


ニコニコ動画でNullPointe…の動画を見に行く
ヌルポインタエクセプション
2.2千文字の記事
  • 11
  • 0pt
掲示板へ

NullPointerExceptionとは、ぬるぽである。ガッ。

 

もとい、Javaの代表的な実行時例外のひとつ。NPEと略される。
→ぬるぽ

ようこそJavaの世界へ

NullPointerExceptionは、Javaの世界に入門した人間が最初に出会う例外、そして生涯付き合うことになる例外である。NullPointerExceptionをcatchしようなんて思っちゃダメだぞ。

 java.lang.Object
+- java.lang.Throwable
+- java.lang.Exception
+- java.lang.RuntimeException
+- java.lang.NullPointerException

値がnullである参照変数に対して、メソッド呼び出しやフィールドアクセスをしたときなどに発生する実行時例外である。

導入されたバージョン:JDK 1.0.

要するに、なんなの?

ポインタとして見たとき

プログラムは、処理をするために数値を保存しておく箱を持っている。→変数

その箱は全てPCの中のどこに置いてあるかを表す住所をもっているが、その住所も数値なのでまた別の箱に入れて置くことができる。Aという箱の住所がBという箱の中に入れられている時、「Bは、Aを指すポインタである」と言う。

ここでもしBの中に何の数値も入っていないのに(→null)Bをポインタとして扱おうとしたら、Bはどの箱の住所も指していないことになるので、エラーが起きる。これがNullPointerException、すなわちNull(数値がない)Pointer(ポインタの)Exception(エラー)なのである。

※Exceptionは厳密にはエラーとイコールではないが、説明が長くなるので後述。

どれでもありながらどれでもないnull(オブジェクトの視点から)

Javaは型があっていなければコンパイルすることすらできないが、型があってさえいればそれなりに動く「型安全」が言語仕様としての特長の一つである。

ところでnullはどうであろうか。nullはすべてのクラスのインスタンスとして代入に使用できる。しかし、nullは一切メソッドを持たないのでいかなるクラスの要件も満たしていない。すなわちnullは「どれでもありながらどれでもないオブジェクト」ということができ、この性質がエラーの原因でもある。

 nullはすべての型に値として代入されコンパイルを通ってしまうが、一方でどんなメソッドを呼び出しても動作しない。型安全の例外がnullなのである。

Javaにおける例外処理について

Javaでは、例外をクラスのインスタンスとして指定する。例外に用いることができるクラスは、java.lang.Throwableおよびそのサブクラスに限られる。

Javaでは、例外は大きく分けて3種類ある。

さらば、NullPointerException

Javaの言語仕様に深く根ざした問題であり続けたNullPointerExceptionであったが、2014年、Java8にOptionalクラスが導入されてからは解決の糸口が見えつつある。nullが入りうるところにはOptionalで包んだ値を用い、Optionalから値を取り出すときにnullへの対応を強制することで型安全性を取り戻したのだ。

もっとも、互換性の関係から過去のライブラリ資産へのOptionalクラス導入は進んでおらず、本当に解決されるのは遠い未来のことであるようにも思える。

関連項目

関連記事

親記事

子記事

  • なし

兄弟記事

  • なし
  • 11
  • 0pt
記事編集 編集履歴を閲覧

ニコニ広告で宣伝された記事

天外魔境II (単) 記事と一緒に動画もおすすめ!
提供: ゲスト
もっと見る

この記事の掲示板に最近描かれたお絵カキコ

この記事の掲示板に最近投稿されたピコカキコ

ピコカキコがありません

NullPointerException

68 ななしのよっしん
2017/08/29(火) 23:35:14 ID: wp8cc7VIW7
ずっと思ってたけどC/C++とかやってる身からすればぬるぽエラー出すのって本当にあり得ないと思うの
JavaならException出てVMが止めてくれるけどネイティブじゃ色んなプログラムを巻き込んで破壊していくという
一度も出した事ないとは言わないがもう数年は見てない
👍
高評価
0
👎
低評価
69 ななしのよっしん
2018/10/07(日) 00:45:23 ID: Rbnnu2RPGu
ぬるぽやOptionalに悩まされてる人はObjective-Cを使えば幸せになれるよ
👍
高評価
0
👎
低評価
70 ななしのよっしん
2018/12/28(金) 20:34:08 ID: kIy3b2m9QC
CにはNullPointerExceptionの前にそもそもNULLという概念が無い(ただのdefine定義)
いくらソース上NULLと称したところで要は0なんだから0としての動作をするのは仕方ない
そりゃあポインタ=物理アドレスのチープな環境で書き込めばゼロアドレスも壊すし、関数ポインタでジャンプすればリセットもかかろうというもの
👍
高評価
0
👎
低評価
71 ななしのよっしん
2020/04/11(土) 18:38:58 ID: +U44MTjV2o
defineだろうがなんだろうがNULLはNULLやんけw
0でimplementしてるということと、NULLという概念がないことは全く違う。ついでにいえばNULLは処理系定義なので0という保証もない。
👍
高評価
0
👎
低評価
72 ななしのよっしん
2020/08/19(水) 00:59:46 ID: nIwa/H6hQc
少なくともC++の場合だと「NULLはあくまでも0と言う数値」である事は理解しておくべきではあるけどね。
void MyClass::Func(int *pArg)
void MyClass::Func(int Arg)
と言ったオーバーロードが存在する関数のポインタ変数を渡す方を使っていたとして、もしそのポインタ変数に対して「NULL」をブチ込んだ場合はintの数値を取る方が呼ばれる事になる。
(個人的にはこのようなオーバーロードを定義する事そのものがアウトだと思うが。状況次第か・・・?)

C++11以降なら「NULL」ではなく「nullptr」を使えばこういった事故は回避可能だが。
👍
高評価
0
👎
低評価
73 ななしのよっしん
2020/08/19(水) 11:14:08 ID: r9HOve4fEX
>>67
optionalはflatMapとhaskellやScalaのようなflatMap用の構文ないとまぁ扱い辛い
👍
高評価
0
👎
低評価
74 ななしのよっしん
2022/06/20(月) 18:03:15 ID: c9+XxGQqbu
👍
高評価
1
👎
低評価
75 ななしのよっしん
2022/07/19(火) 20:00:32 ID: IzgrNpkXIC
英語風だと「ナル」かぁ
「ぬる」は語感がいいから日本語として定着して欲しい
vinylだってビニールとして定着したんだし問題ないはず
👍
高評価
1
👎
低評価
76 ななしのよっしん
2022/11/25(金) 18:10:04 ID: k9mp0nxhbn
👍
高評価
2
👎
低評価
77 ななしのよっしん
2026/03/26(木) 22:23:18 ID: XUNDY6kq3I
>NullPointerExceptionもこれである。きちんとtry-catchすることが望ましいが、(以下略

ダメだよ。RuntimeExceptionをcatchしちゃ。
RuntimeExceptionはcatchしてはならない例外。なぜならばバグが存在しないプログラムは決してコレが発生しないから。(建前上は。)
これが投げられた時点で、プログラムはプログラマの何ぞ図らん状態に陥っているので、catchせずにサクッと死んで暴走を停めるのがあるべき姿。

まあこれは理想論で、何事にも例外はあるのだけれど。
👍
高評価
1
👎
低評価