为什么不能在 Java 中调用空指针上的方法?

在 Go 中,可以在空指针上调用方法,只要该指针永远不会被取消引用:


type empty struct{}

func (e *empty) Allocated() bool { return e != nil }

(对于可运行的代码,请单击此处)


然而,在 Java 中,在空指针上调用方法,即使该方法从不取消对任何成员变量的引用,仍然会导致空指针异常:


class Test {

    public boolean Allocated() { return this != null; }

}

有人知道为什么存在这种行为吗?它有什么好处吗?想法?


冉冉说
浏览 270回答 3
3回答

人到中年有点甜

这是因为所有 Java 方法都是虚拟的。编写时someInstance.Allocated(),运行时需要检查是否someInstance实际上是覆盖该方法的派生类型。从理论上讲,此限制本可以针对final或private方法放宽。我假设语言设计者选择不这样做是为了一致性。(因此删除final不会是一个重大变化)

MM们

我认为这是一个哲学问题;方法(静态方法除外)就其本质而言适用于对象,并且在这种范式中调用像“null”这样的非对象上的方法是没有意义的。如果您想定义一个可以应用于对象或“null”的方法,那么定义一个静态方法就足够容易了,而且在我看来,这将使调用该方法的代码不会让读者感到困惑。
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Go