这是疏忽吗?或者它与JVM有关吗?
答案 0 :(得分:26)
Java确实有指针 - 你无法执行指针运算的指针。
来自尊敬的JLS:
Java编程语言中有两种类型:基本类型(第4.2节)和引用类型(第4.3节)。相应地,有两种数据值可以存储在变量中,作为参数传递,由方法返回,并在以下操作:原始值(§4.2)和参考值(§4.3)。
对象是类实例或数组。
参考值(通常只是引用)是这些对象的指针,以及一个特殊的空引用,它不引用任何对象。
(强调他们的)
所以,要解释一下,如果你写:
Object myObj = new Object();
然后myObj
是引用类型,其中包含引用值,它本身就是新创建的{em>指针 {1}}。
因此,如果您将Object
设置为myObj
,则将参考值(又名指针)设置为null
。因此,当取消引用变量时,会合理地抛出NullPointerException。
别担心:此话题之前已为heartily debated。
答案 1 :(得分:3)
在Java中,他们使用命名法REFERENCE来引用动态创建的对象。在以前的语言中,它被命名为POINTER。正如面向对象语言中METHODS的命名已经取代了之前的FUNCTION和PROCEDURE(面向对象以及非面向对象)语言。在这个命名或新标准中没有特别好或坏,它只是命名能够创建以前的动态对象,挂在空中(堆空间)并被固定对象引用引用的现象的另一种方式(或动态参考也挂在空中)。新标准的作者(使用METHODS和REFERENCES)特别提到新标准的实施是为了使其符合即将到来的规划系统 - 例如UML和UP,其中使用面向对象的术语规定使用ATTRIBUTES,方法和参考,而不是变量,函数和指针。
现在,你可能现在想,它只是一个重命名,但这将简化过程的描述,而不仅仅是语言以发展的名义所采取的漫长道路。方法在本质上与过程不同,因为它在类的范围内操作,而过程本质上在全局范围内操作。类似地,属性不仅仅是变量的新名称,因为属性是类(及其实例 - 对象)的属性。类似地,引用,这是这里的小写的背后的问题,是不同的,因为它是类型的,因此它没有指针的典型属性,是对存储器单元的原始引用,因此,引用又是结构化引用基于记忆的对象。
现在,在Java内部,即Java的底层,在底层C代码和Java代码(虚拟机)之间存在仲裁层。在该仲裁层中,发生抽象,因为引用的基础(裸金属)实现(如虚拟机所做的那样)保护引用不涉及引用裸金属(没有结构的存储器单元)。因此,原始的事实是,NullPointerException确实是一个空指针异常,而不仅仅是一个空引用异常。但是,这个事实可能与Java环境中的程序员完全无关,因为他/她在任何时候都不会与裸机JVM联系。
答案 2 :(得分:1)
我想这与JVM是用C ++编码的事实有关。除此之外,指针和引用几乎相似。你可以说Java中的引用机制是使用C ++指针实现的,名称'NullPointerException'允许实现细节发光。
答案 3 :(得分:1)
我认为答案是我们永远不会真正了解真正的答案。
我怀疑在Java 1.0发布之前的某个时候,有人定义了一个名为NullPointerException
的类。要么是那个人的名字错了,要么术语没有稳定;即尚未作出使用“参考”一词而非“指针”的决定。
无论哪种方式,很可能没有人注意到在不破坏向后兼容性的情况下无法修复不一致性。如果你看起来很难,还有其他一些小的不一致。还有一些更严重的问题由于同样的原因无法修复。
但这只是猜想。
答案 4 :(得分:0)
这是因为Java的设计考虑了C程序员。在C语言中,使用“指针”一词代替“参考”