NullPointerException単語

5件
ヌルポインタエクセプション
1.4千文字の記事
  • 8
  • 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なのである。

さらば、NullPointerException

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

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

関連項目

【スポンサーリンク】

  • 8
  • 0pt
記事編集 編集履歴を閲覧

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

ニコニ広告 (単) 記事と一緒に動画もおすすめ!
提供: ももぬこ
もっと見る

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

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

ピコカキコがありません

NullPointerException

67 ななしのよっしん
2017/07/22(土) 01:33:59 ID: eihmoJro3n
optionalの思想ってswift等色んな言に導入されつつあるけど
あれはあれでめんどくさいっつかなんか気持ち悪いんだよなあ
妥協の産物だってことがミエミエで
👍
高評価
1
👎
低評価
0
68 ななしのよっしん
2017/08/29(火) 23:35:14 ID: wp8cc7VIW7
ずっと思ってたけどC/C++とかやってる身からすればぬるぽエラー出すのって本当にあり得ないと思うの
JavaならException出てVMが止めてくれるけどネイティブじゃ色んなプログラムを巻き込んで破壊していくという
一度も出した事ないとは言わないがもう数年は見てない
👍
高評価
0
👎
低評価
0
69 ななしのよっしん
2018/10/07(日) 00:45:23 ID: Rbnnu2RPGu
ぬるぽOptionalに悩まされてる人はObjective-Cを使えば幸せになれるよ
👍
高評価
0
👎
低評価
0
70 ななしのよっしん
2018/12/28(金) 20:34:08 ID: kIy3b2m9QC
CにはNullPointerExceptionの前にそもそもNULLという概念い(ただのdefine定義)
いくらソースNULLと称したところで要は0なんだから0としての動作をするのは仕方ない
そりゃあポインタ=物理アドレスチープな環境で書き込めばゼロアドレスも壊すし、関数ポインタジャンプすればリセットもかかろうというもの
👍
高評価
0
👎
低評価
0
71 ななしのよっしん
2020/04/11(土) 18:38:58 ID: +U44MTjV2o
defineだろうがなんだろうがNULLNULLやんけw
0でimplementしてるということと、NULLという概念がないことは全く違う。ついでにいえばNULLは処理系定義なので0という保もない。
👍
高評価
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
👎
低評価
0
73 ななしのよっしん
2020/08/19(水) 11:14:08 ID: r9HOve4fEX
>>67
optionalはflatMaphaskellScalaのようなflatMap用の構文いとまぁ扱い辛い
👍
高評価
0
👎
低評価
0
74 ななしのよっしん
2022/06/20(月) 18:03:15 ID: c9+XxGQqbu
👍
高評価
0
👎
低評価
0
75 ななしのよっしん
2022/07/19(火) 20:00:32 ID: IzgrNpkXIC
英語だと「ナル」かぁ
「ぬる」は感がいいから日本語として定着して欲しい
vinylだってビニールとして定着したんだし問題ないはず
👍
高評価
1
👎
低評価
0
76 ななしのよっしん
2022/11/25(金) 18:10:04 ID: k9mp0nxhbn
👍
高評価
1
👎
低評価
0