我们可以在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。