NullPointerException
是當(dāng)您嘗試使用指向內(nèi)存中任何位置 (null) 的引用時(shí)發(fā)生的異常,就像引用對(duì)象一樣。對(duì)空引用調(diào)用方法或嘗試訪問(wèn)空引用的字段將觸發(fā) NullPointerException
。這些是最常見(jiàn)的,但 中列出了其他方法NullPointerException
javadoc ???.
NullPointerException? ???? ?? ?? ??? ? ?? ?? ?? ?? ??? ??? ??? ????.
???? main
內(nèi)的第一行,我顯式地將 Object
引用 obj
設(shè)置為 null
。這意味著我有一個(gè)引用,但它沒(méi)有指向任何對(duì)象。之后,我嘗試通過(guò)調(diào)用該引用的方法來(lái)將該引用視為指向一個(gè)對(duì)象。這會(huì)導(dǎo)致 NullPointerException
??? ???? ??? ??? ??? ?? ?????.
(??? ???? ????? ??? ??? ??? ?????. null? ?? ??? ??? ??? ??? ???? C ???? ???? ????. null ???? ??? ?? ??? ???? ????. ?? ?????. ??? ??? ???? ?? ?? ??? ?? )
Java?? ? ?? ?? ??? ??? ????.
Primitives: ???? ??? ?????. ?? ??? ???? ????? ??? ?? ???? ???. ????? ?? ??? ???? ?????. ?? ?? int
或 char
??? ??? ?? ?????.
Reference: Object
? ??? ??? ??? ??, ? 對(duì)象
內(nèi)存地址的變量,即引用對(duì)象的變量代碼>.如果您想要操作引用變量引用的Object
,則必須取消引用它。取消引用通常需要使用 .
訪問(wèn)方法或字段,或使用 [
索引數(shù)組。按照慣例,引用類(lèi)型通常用以大寫(xiě)字母開(kāi)頭的類(lèi)型來(lái)表示。例如,Object
Object
?? ???. ?????? ????? .
? ???? ???? ??? ?????? [
? ???? ??? ????? ???. ????? ?? ??? ????? ???? ???? ???? ?????. ?? ?? Object
??? ??? ?????. int
? x
指定任何值,而我們正在嘗試使用 x
的值來(lái)指定 y
raw
???
? ? ?? >? ?? ??? ????? ??????. ?? ?????? ???? ?? ?? ??? ??? ?????? ???. null
,這意味著“我沒(méi)有引用任何東西”。如果您以這種方式顯式設(shè)置引用變量,則可以在引用變量中獲取 null
值,或者引用變量未初始化并且編譯器不會(huì)捕獲它(Java 會(huì)自動(dòng)將該變量設(shè)置為 null
References??? null
? ??? ? ????. ?? "???? ???? ???? "? ?????. ?? ???? ?? ??? ????? ???? ?? ???? null
?? ?? ? ???, ?? ??? ????? ?? ????? ?? ???? ????(Java? ???? ??? ???). null
?). NullPointerException
??? NullPointerException
??? ??
????? ??? ????? ??? ??? ???? ?? ??? ???? ??? ???? ?? ? ?????
(NPE). ??? ??? ???? ?? ?? ???? ?? ????. num
的變量,但它實(shí)際上還不包含引用值。由于您還沒(méi)有說(shuō)出要指向什么,Java 將其設(shè)置為 null
???
new
關(guān)鍵字用于實(shí)例化(或創(chuàng)建)一個(gè)Integer
類(lèi)型的對(duì)象,引用變量num
被分配給該 Integer
? ?? ??
num
,,您將得到一個(gè)NullPointerException
。在最簡(jiǎn)單的情況下,編譯器會(huì)捕獲問(wèn)題并讓您知道“num 可能尚未初始化
? ?? ?,
??? ???? ??
num
? ?????? ?? obj
,而是假設(shè)它是在調(diào)用 doSomething()
num? ????? ??? ? ????
"?? ?? ??? ??? ??? ?? ???? ?? ??? ??? ?? ????. ??
???? ?? ??? ?? ??? ?? ? ????. ??
???
??? ?? ?? ??? ??? ??? ??? ???? ????. ???? ??? ?? ??? ? ????. ?????
? ???? obj
為 null
,并且語(yǔ)句 obj.myMethod()
將拋出 NullPointerException
>.
???? ?? ????? ??? ??? ?? ?? ??? ????? ?? NullPointerException
? ??? ?? ?????. ?? ????? ???? ?????? ??? ???? ?? ??? ???? ?????.
??? ???? ?? ??? NullPointerException
異常之外,您還可以檢查方法參數(shù)中的 null
?? ???, ??? ?????
???
?? ???? ?? null
???
?? ?? ???? ???? ??? ??? ??? ?? ??? ???? ??? ???? ? ?? ??? ??? ? ????. ? ?? null ????? ???? ??? ???? ???. ????? ?? ?? ???? ???. ?? ?? doSomething()
? ??? ?? ? ? ????.
????? ?? ??? ???? ?? ? ??? ???? ??
?? ?? ??? ?? ?? ?? ???? NPE? ??? ? ????. ??? JVM?? ?? ? ??? ??? ???? ??? ? ????一個(gè)>
?? Java 14?? NullPointerException? ?? ??? ???? ??? ?? ??? ???????. ? ?? ??? 2006??? SAP Business JVM? ??????.
Java 14?? ??? NullPointerException ?? ???? ????.
NullPointerException
?? ???? ?? ????? Java ?? ???? ??? ?? NullPointerException
? ??* ???? ?? ?????.
拋出空值;
synchronized (someNullReference) { ... }
NullPointerException
NullPointerException
?????. super
? ???? super
會(huì)引發(fā) NullPointerException
? ?????. ?????? ?? ???? ????? ??? ??? ?? ????. ? ???/??? ????? for (element : iterable)
??? ?????.
switch (foo) { ... }
(無(wú)論是表達(dá)式還是語(yǔ)句)在 foo
時(shí)可以拋出 NullPointerException
?? ????.
foo.new SomeInnerClass()
當(dāng) foo
為 null 時(shí)拋出 NullPointerException
.
name1::name2
或 primaryExpression::name
形式的方法引用在以下情況下求值時(shí)會(huì)拋出 NullPointerException
name1 或 primaryExpression
? null? ?????.
JLS? ??? ??? someInstance.someStaticMethod()
不會(huì)拋出 NPE,因?yàn)?someStaticMethod
是靜態(tài)的,但 someInstance:: someStaticMethod
??? NPE? ?????!
* JLS? NPE? ?? ????? ???? ?? ??? ?? ?????.