12 回答

TA貢獻1828條經驗 獲得超3個贊
NullPointerException
s是當您嘗試使用指向內存中沒有位置的引用(null)時發生的異常,就好像它引用了一個對象一樣。在空引用上調用方法或嘗試訪問空引用的字段將觸發a NullPointerException
。這些是最常見的,但NullPointerException
javadoc頁面上列出了其他方式。
可能是我能想出的最快的示例代碼來說明NullPointerException
:
public class Example { public static void main(String[] args) { Object obj = null; obj.hashCode(); }}
在內線的第一行main
,我明確地將Object
引用設置為obj
等于null
。這意味著我有一個引用,但它沒有指向任何對象。之后,我嘗試將引用視為通過調用其上的方法指向對象。這導致a NullPointerException
因為沒有代碼在引用指向的位置執行。
(這是一個技術性問題,但我認為值得一提的是:指向null的引用與指向無效內存位置的C指針不同??罩羔槍嶋H上并不指向任何位置,這與指向恰好無效的位置。)

TA貢獻1921條經驗 獲得超9個贊
這就像你試圖訪問一個對象null
??紤]下面的例子:
TypeA objA;
此時您剛剛聲明了此對象但未初始化或實例化。每當你試圖訪問其中的任何屬性或方法時,它都會拋出NullPointerException
有意義的東西。
請參閱以下示例:
String a = null;System.out.println(a.toString()); // NullPointerException will be thrown

TA貢獻1862條經驗 獲得超7個贊
一個null
指針是一個指向無處。當你解引用一個指針p
,你說“給我的數據在存儲中的位置‘P’,當p
是一個null
指針,該位置存儲在p
就是nowhere
,你說‘給我的數據在位置‘無處’?!@然,它不能這樣做,所以它拋出一個null pointer exception
。
一般來說,這是因為某些東西尚未正確初始化。

TA貢獻1804條經驗 獲得超3個贊
已經有很多解釋來解釋它是如何發生的以及如何解決它,但你也應該遵循最佳實踐來避免它NullPointerException
。
另請參閱: 最佳實踐列表
我想補充一點,非常重要的是,要好好利用final
修飾語。 在Java中適用時使用“final”修飾符
摘要:
使用
final
修飾符強制執行良好的初始化。避免在方法中返回null,例如在適用時返回空集合。
使用注釋
@NotNull
和@Nullable
快速失敗并使用斷言來避免null對象在不應為null時在整個應用程序中傳播。
首先使用equals與已知對象:
if("knownObject".equals(unknownObject)
喜歡
valueOf()
toString()。使用null安全
StringUtils
方法StringUtils.isEmpty(null)
。

TA貢獻1827條經驗 獲得超4個贊
NullPointerException
當一個聲明一個對象數組時,會發生另一次出現,然后立即嘗試取消引用它內部的元素。
String[] phrases = new String[10];String keyPhrase = "Bird";for(String phrase : phrases) { System.out.println(phrase.equals(keyPhrase));}
如果比較順序顛倒,可以避免這種特殊的NPE; 即,.equals
在有保證的非null對象上使用。
數組內的所有元素都被初始化為它們的公共初始值 ; 對于任何類型的對象數組,這意味著所有元素都是null
。
你必須初始化數組中的元素之前訪問或提領他們。
String[] phrases = new String[] {"The bird", "A bird", "My bird", "Bird"};String keyPhrase = "Bird";for(String phrase : phrases) { System.out.println(phrase.equals(keyPhrase));}
添加回答
舉報