這是疏忽嗎?或者它與JVM有關嗎?Java:爲什麼不是NullPointerExceptions被稱爲NullReferenceExceptions?
回答
Java確實有指針 - 你不能執行指針運算的指針。
從古老的JLS:
有兩種類型的Java編程語言:基本類型(4.2節)和引用類型(第4.3節)。相應地,有兩種數據值可以存儲在變量中,作爲參數傳遞,通過方法返回,並對原始值(§4.2)和參考值(§4.3)進行操作。
而且later:
一種對象是類實例或陣列。
參考值(通常僅引用)是指針到這些目的,和一個特殊的空引用,這是指沒有對象。
(強調他們)
所以,要解釋,如果你寫:
Object myObj = new Object();
然後myObj
是引用類型含有參考值這本身就是一個指針到新創建的Object
。
因此如果設置myObj
到null
您在基準值(又名指針)設置爲null
。因此,當該變量被解引用時,NullPointerException被合理地拋出。
別擔心:此話題已被heartily debated之前。
我想這與JVM是用C++編碼的事實有關。除此之外,指針和引用幾乎是相似的。您可以說Java中的引用機制是使用C++指針實現的,名稱爲'NullPointerException'允許實現細節通過。
這是由於Java設計時考慮到了C程序員。在C terminoligy中,使用'pointer'這個詞來代替'reference'
是的,但Java使用參考:p – hhafez 2010-04-08 03:13:55
在Java中,他們使用命名參考來引用動態創建的對象。在以前的語言中,它被命名爲POINTER。就像面嚮對象語言中的METHODS的命名已經從之前的FUNCTION和PROCEDURE的(面向對象的而不是面向對象的)語言中接管了。在這個命名或新標準中沒有特別的更好或更糟的是,它只是另一種能夠創建以前的動態對象,掛在空中(堆空間)並被固定對象引用引用的現象的方式(或懸掛在空中的動態參考)。新標準(使用METHODS和REFERENCES)的作者特別提到新標準的實施是爲了使其與即將到來的規劃系統(例如UML和UP)相一致,其中使用面向對象的術語規定使用ATTRIBUTES,方法和參考文獻,而不是變量,函數和指針。
現在你可能會想,現在它只是一種重命名,但這將簡化過程的描述,而不僅僅是語言以發展爲名所走的漫長道路。一種方法在性質上與程序有所不同,因爲它在一個類的範圍內運作,而程序本質上在全球範圍內運作。類似地,屬性不僅僅是變量的新名稱,因爲屬性是類(及其實例 - 對象)的屬性。同樣,引用是這個小寫作背後的問題,它的不同之處在於它是鍵入的,因此它沒有指針的典型屬性,是對存儲單元的原始引用,因此引用是對基於內存的對象。
現在,在Java內部,即在Java的胃中,底層C代碼和Java代碼(虛擬機)之間存在仲裁層。在該仲裁層中,抽象發生在如虛擬機完成的引用的基礎(裸機)實現中,從而保護引用不引用裸機(沒有結構的存儲單元)。原因是,NullPointerException是一個真正的空指針異常,而不僅僅是一個空引用異常。然而,這個事實對於Java環境中的程序員來說可能是完全不相關的,因爲他/她在任何時候都不會與裸機JVM聯繫。
我認爲答案是我們永遠不會真正知道真正的答案。
我懷疑在Java 1.0發佈之前的一段時間,有人定義了一個名爲NullPointerException
的類。要麼這個人的名字錯了,要麼術語不穩定;即沒有做出使用術語「參考」而不是「指針」的決定。
無論哪種方式,很可能沒有人注意到不矛盾不能修復,而不會破壞向後兼容性。如果你看起來很辛苦,還有其他一些小的不一致之處。還有一些更嚴重的問題由於相同的原因而無法解決。
但這只是猜想。
爲什麼隨機向下投票? – 2011-06-03 13:17:36
- 1. Silverlight:爲什麼XAP被稱爲XAP,爲什麼不是其他?
- 2. 爲什麼jQuery被稱爲jQuery?名稱的原因是什麼?
- 3. 爲什麼mojolicious行動不被稱爲?
- 4. 爲什麼alter命令被稱爲DDL而不是DML?
- 5. 爲什麼HTML助手類被稱爲Html而不是HtmlHelper?
- 6. 爲什麼typeof被稱爲運算符而不是函數?
- 7. Overriding-爲什麼長被稱爲的不是int
- 8. 爲什麼argsort被稱爲argsort?
- 9. 爲什麼SP-Initiated被稱爲SSO?
- 10. 爲什麼cookies被稱爲「cookies」?
- 11. 爲什麼密碼鹽被稱爲「鹽」?
- 12. 爲什麼Method#arity被稱爲「arity」?
- 13. 爲什麼cc1被稱爲cc1?
- 14. 爲什麼AJAX被稱爲異步?
- 15. 爲什麼Common Table Expression被稱爲「Common」?
- 16. 爲什麼9patch被稱爲9patch
- 17. 爲什麼'Select'被稱爲DML語句?
- 18. 爲什麼Java中的SecureRandom稱爲CS PRNG而不是TRNG?
- 19. 爲什麼字符串在java中被稱爲immutable?
- 20. Java:爲什麼TreeMap被稱爲「樹」地圖?
- 21. 爲什麼Java中的lambda表達式被稱爲「lambda」?
- 22. 爲什麼bash的行爲不同,當它被稱爲sh?
- 23. 爲什麼在爲對象設置值時收到NullPointerExceptions?
- 24. 不明白爲什麼我的方法不被稱爲
- 25. 爲什麼產品被稱爲minterms和稱爲maxterms?
- 26. 這是爲什麼除了被稱爲? - Python
- 27. 爲什麼不是presentationController:viewControllerForAdaptivePresentationStyle:被調用?
- 28. 爲什麼形式摧毀事件被稱爲不止一次?
- 29. 爲什麼rowHeight數據源方法不被稱爲
- 30. 爲什麼該方法不被稱爲異步任務?
因爲指針和引用是一樣的東西。代表這個想法的同義詞並不重要。 – Val 2013-08-19 10:09:27