我们可以在null对象上调用任何方法吗?

可能吗?

Object obj=null; obj.someMethod(); someMethod{/*some code here*/} 

您可以在空指针上调用静态方法。 在静态方法调用中,指针自然会被完全忽略,但是当(看不到类定义)看起来应该导致NullPointerException正常运行时,它仍然是一种情况。

 class FooObject { public static void saySomething() { System.out.println("Hi there!"); } } class Main { public static void main(String[] args) { FooObject foo = null; foo.saySomething(); } } 

但只是为了说清楚 – 不,你不能用空指针调用实例方法。 保护程序员不受此限制是将Java等语言与C ++等“低级语言”区别开来的真正基本保护措施之一。 它允许在调用端报告错误,而不是在方法本身内导致一个莫名其妙的段错误/诸如此类的错误。

不,我们不能。 只要方法不是静态的,它就会抛出NullPointerException。 如果方法是静态的,它将运行。

阅读: null:Java词汇表

在Java中,null不是对象。

“obj”变量引用堆上没有实例。 因此,您将在运行时获得nullpointerexception。 即使您的Java IDE(Eclipse,IDEA)也会发现问题并向您发出警告。

不,没有办法在null引用上调用方法(除非该方法是静态的!)。 ( null不表示某个“基础”对象,它表示一个根本不指向任何对象的引用 。)

这工作正常( ideone.com链接 ):

 class MethodTest { static void someMethod() { System.out.println("Hello World"); } } class Test { public static void main(String[] args) { MethodTest mt = null; mt.someMethod(); } } 

JLS的相关报价

15.12.4.4找到要调用的方法
方法查找的策略取决于调用模式。

[…]

如果调用模式是static ,则不需要目标引用,也不允许覆盖。 类T方法m是要调用的方法。

否则,将调用实例方法并且存在目标引用。 如果目标引用为null ,则此时抛出NullPointerException 否则,目标引用被称为引用目标对象,并将在调用的方法中用作关键字this的值。

[…]

你不能执行

null.someMethod(); !

这将始终抛出NullPointerExcpetion除非someMethod声明为static。 但是,在实例上调用静态方法是非常糟糕的做法。

这不会编译,因为Object没有someMethod() 。 但是,如果你在谈论类似的东西

 MyClass o = null; o.someMethod(); 

答案取决于someMethod是否为静态。 如果它是静态的,则忽略该值,如果它为null,则无关紧要。

例如

 Thread t = null; t.yield(); 

没有例外,运行良好。

空对象不存在。 在您的示例中,您有一个变量(指针),可以存储对实例的引用,也可以不存储任何内容。

如果它没有指向实例 – 那么我们就不能用它来调用方法或访问字段。


等待,等待 – 这编译并运行:

 Math m = null; System.out.println(m.max(1,2)); 

我们可以调用静态方法并访问任何变量中的静态字段(我们只需要忽略编译器/ IDE警告!) 但这是不同的,静态方法/变量不是在实例上调用/访问,而是在类本身上调用/访问。

是的 ,如果方法是静态的,则可以调用,因为静态方法在编译时被绑定,并且只有变量类型用于静态绑定而不是对象的值。

如果您对非静态方法尝试相同,请准备捕获空指针exception。