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

时间:2011-05-02 08:50:07

标签: java null method-call

有可能吗?

Object obj=null;

obj.someMethod();

someMethod{/*some code here*/}

10 个答案:

答案 0 :(得分:7)

您可以在空指针上调用静态方法。在静态方法调用中,指针自然会被完全忽略,但是当(看不到类定义)看起来应该导致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 ++等“低级语言”区别开来的真正基本保护措施之一。它可以在调用端报告错误,而不是在方法本身内部引起一个莫名其妙的段错误。

答案 1 :(得分:4)

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

阅读本文:null : Java Glossary

答案 2 :(得分:3)

没有。在Java中,null不是对象。

答案 3 :(得分:2)

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

答案 4 :(得分:1)

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

但这可行(ideone.com link):

class MethodTest {
    static void someMethod() {
        System.out.println("Hello World");
    }
}

class Test {
    public static void main(String[] args) {
        MethodTest mt = null;
        mt.someMethod();
    }
}

Relevant quote from the JLS

  

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

     

[...]

     

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

     

否则,将使用实例方法   调用并且有一个目标   参考。 如果目标参考是   T,抛出null   此时。否则,目标   据说引用是指目标   对象并将用作值   被调用的关键字NullPointerException   方法

     

[...]

答案 5 :(得分:0)

你无法执行

null.someMethod(); !!!

答案 6 :(得分:0)

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

答案 7 :(得分:0)

这不会编译,因为Object没有someMethod()。但是,如果你在谈论像

这样的话
MyClass o = null;
o.someMethod();

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

e.g。

Thread t = null;
t.yield();

没有例外地运行正常。

答案 8 :(得分:0)

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

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


等待,等待 - 这会编译并运行:

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

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

答案 9 :(得分:0)

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

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