回答
沒有我們不能。只要方法不是靜態的,它將拋出NullPointerException。如果方法是靜態的,它將運行。
+0:如果someMethod()是靜態的,則不會。 – 2011-05-02 09:00:20
@Nirmal,我建議你試試看。看我的例子。 ;) – 2011-05-02 09:05:05
@peter:試過了,是的,你是對的。 – 2011-05-02 09:07:44
號在Java中,null是不是一個對象。
「obj」變量引用堆中沒有實例。出於這個原因,你將在運行時得到一個nullpointerexception。即使你的Java IDE(Eclipse,IDEA)也能解決這個問題並警告你。
不適用於靜態方法。 IDE經常標記這是正確的。 – 2017-11-23 14:02:19
這將始終拋出NullPointerExcpetion
,除非someMethod聲明爲靜態。但是,對實例調用靜態方法是非常糟糕的做法。
你可以調用一個空指針的靜態方法。在一個靜態方法調用中,指針自然會被完全忽略,但是當(看不到類定義)看起來應該導致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++之類的「低級語言」中分離出來。它可以在調用端報告錯誤,而不是在方法本身內部造成莫名其妙的段錯誤。
應該注意的是,從這樣的變量中調用一個'static'方法幾乎被普遍認爲是不好的風格:它暗示了一個沒有的時候的關係。 – 2011-05-02 09:13:21
爲什麼*幾乎*?你知道任何情況下,它是首選嗎? – aioobe 2011-05-02 09:24:05
@aioobe你可能想要指出它屬於一個變量「nearby」,而不必解析變量具有這個靜態類所屬的特定類型。 – 2017-11-23 14:01:46
由於對象沒有someMethod()
,所以不會編譯。但是如果你正在談論類似
MyClass o = null;
o.someMethod();
答案取決於someMethod是否是靜態的。如果它是靜態的,則該值將被忽略,並且它是否爲空也沒關係。
例如
Thread t = null;
t.yield();
正常運行沒有例外。
A 空對象不存在。在你的例子中,你有一個變量(一個指針),可以存儲對一個實例的引用或者沒有任何東西。
如果它沒有指向一個實例 - 那麼我們就不能用它來調用方法或訪問字段。
等待,等待 - 這編譯和運行:
Math m = null;
System.out.println(m.max(1,2));
我們可以調用任何變量靜態方法和訪問靜態字段(我們只需要忽略編譯器/ IDE警告!)但是這是不同的東西,一個靜態方法/變量不被調用/訪問的實例,但在類本身。
不,沒有辦法調用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();
}
}
15.12.4.4找到方法來調用
方法查找策略取決於調用模式下的 。[...]
如果調用模式是
static
,不需要目標參考和重寫是不允許的。類T
的方法m
是要被調用的方法。否則,實例方法將被調用 並且有一個目標 參考。 如果目標參考是
null
,則在此處被拋出 。否則,目標 參考被稱爲指代目標 對象,並將被用作調用的 方法中的關鍵字this
的值 。[...]
是你可以調用,如果因爲靜態方法是在編譯時的約束,唯一的變量的類型用於靜態綁定不是對象的值的方法是靜態的。
如果您對非靜態方法嘗試相同,則準備好捕獲空指針異常。
- 1. 我們可以在java中使用子類對象調用sleep()方法嗎?
- 2. 我們可以使用對象訪問靜態方法嗎?
- 3. Java - 我可以在遠程對象中調用任意數量的方法嗎?
- 4. 我們可以創建子類的對象並調用父類的方法嗎?
- 5. 我們可以在抽象類中使用靜態方法嗎?
- 6. 我們可以在contextInialized方法內調用getServletContext()嗎?
- 7. 我可以在對象上運行大寫方法嗎?
- 8. 我可以從Universal JS App(.NET)調用任何C#方法嗎?
- 9. 我們可以在任何代碼行上使用ignore_user_abort()嗎?
- 10. 我們可以用Java中的空對象調用靜態方法嗎?如果是這樣,怎麼樣?
- 11. Java - 是否可以在任何對象上調用接口方法?
- 12. 我們可以用Struts2中的參數調用方法嗎?
- 13. JNI可以在初始化時調用對象的方法嗎?
- 14. 我們可以調用rake任務中的控制器方法嗎?
- 15. 我可以在Ajax調用上編輯響應對象嗎?
- 16. 我們可以通過js調用java方法嗎?
- 17. 我們可以從img tag src調用servlet的doPost方法嗎?
- 18. 我們可以從java調用python方法嗎?
- 19. 我們可以用主要方法調試Java程序嗎?
- 20. 我可以從wsdl調用方法嗎?
- 21. 我們可以測試DeviceAnyWhere上的任何應用程序嗎?
- 22. 我可以在任何HTML元素上調用appendChild嗎?
- 23. 在完全創建對象之前可以調用對象方法嗎?
- 24. 我可以信任調用PHP __destruct()方法嗎?
- 25. 在iOS上,我們可以從UIScreen對象到達主UIWindow對象嗎?
- 26. 我們可以禁用AOP調用嗎?
- 27. 我們可以在gridview的數據上添加on_click方法嗎?
- 28. 我們可以在OnCreate()方法中將View對象作爲參數發送嗎?
- 29. 何時可以調用對象的原型鏈上的方法?
- 30. 我可以在對象而不是類中調用GORM「find」方法嗎?
那麼你肯定*可以* ...只是因爲你得到一個'NullPointerException',方法不能被執行。 – 2011-05-02 08:53:49