2011-05-02 136 views

回答

4

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

阅读:null : Java Glossary

+4

+0:如果someMethod()是静态的,则不会。 – 2011-05-02 09:00:20

+1

@Nirmal,我建议你试试看。看我的例子。 ;) – 2011-05-02 09:05:05

+1

@peter:试过了,是的,你是对的。 – 2011-05-02 09:07:44

3

号在Java中,null是不是一个对象。

0

你不能执行

null.someMethod(); !

+1

不是这样,但'((ClassWithStaticMethod)null).someMethod()'工作得很好;-) – aioobe 2011-05-02 09:08:17

+0

是的,它的真正的静态方法 – 2011-05-02 09:09:58

+1

什么是真的?.. – aioobe 2011-05-02 09:11:01

2

“obj”变量引用堆中没有实例。出于这个原因,你将在运行时得到一个nullpointerexception。即使你的Java IDE(Eclipse,IDEA)也能解决这个问题并警告你。

+0

不适用于静态方法。 IDE经常标记这是正确的。 – 2017-11-23 14:02:19

0

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

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++之类的“低级语言”中分离出来。它可以在调用端报告错误,而不是在方法本身内部造成莫名其妙的段错误。

+5

应该注意的是,从这样的变量中调用一个'static'方法几乎被普遍认为是不好的风格:它暗示了一个没有的时候的关系。 – 2011-05-02 09:13:21

+1

为什么*几乎*?你知道任何情况下,它是首选吗? – aioobe 2011-05-02 09:24:05

+0

@aioobe你可能想要指出它属于一个变量“nearby”,而不必解析变量具有这个静态类所属的特定类型。 – 2017-11-23 14:01:46

0

由于对象没有someMethod(),所以不会编译。但是如果你正在谈论类似

MyClass o = null; 
o.someMethod(); 

答案取决于someMethod是否是静态的。如果它是静态的,则该值将被忽略,并且它是否为空也没关系。

例如

Thread t = null; 
t.yield(); 

正常运行没有例外。

0

A 空对象不存在。在你的例子中,你有一个变量(一个指针),可以存储对一个实例的引用或者没有任何东西。

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


等待,等待 - 这编译和运行:

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

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

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,不需要目标参考和重写是不允许的。类T的方法m是要被调用的方法。

否则,实例方法将被调用 并且有一个目标 参考。 如果目标参考是 null,则在此处被抛出 。否则,目标 参考被称为指代目标 对象,并将被用作调用的 方法中的关键字this的值 。

[...]

0

你可以调用,如果因为静态方法是在编译时的约束,唯一的变量的类型用于静态绑定不是对象的值的方法是静态的。

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

相关问题