2011-05-02 123 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

你可以調用,如果因爲靜態方法是在編譯時的約束,唯一的變量的類型用於靜態綁定不是對象的值的方法是靜態的。

如果您對非靜態方法嘗試相同,則準備好捕獲空指針異常。

相關問題