回答
没有我们不能。只要方法不是静态的,它将抛出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. Java - 我可以在远程对象中调用任意数量的方法吗?
- 3. 我们可以创建子类的对象并调用父类的方法吗?
- 4. 我们可以在contextInialized方法内调用getServletContext()吗?
- 5. 我可以在对象上运行大写方法吗?
- 6. 我可以从Universal JS App(.NET)调用任何C#方法吗?
- 7. 我们可以用Struts2中的参数调用方法吗?
- 8. JNI可以在初始化时调用对象的方法吗?
- 9. 我们可以调用rake任务中的控制器方法吗?
- 10. 我可以在Ajax调用上编辑响应对象吗?
- 11. 我们可以通过js调用java方法吗?
- 12. 我们可以从java调用python方法吗?
- 13. 我们可以用主要方法调试Java程序吗?
- 14. 我可以从wsdl调用方法吗?
- 15. 我们可以测试DeviceAnyWhere上的任何应用程序吗?
- 16. 在完全创建对象之前可以调用对象方法吗?
- 17. 我可以在任何HTML元素上调用appendChild吗?
- 18. 我可以信任调用PHP __destruct()方法吗?
- 19. 我们可以在gridview的数据上添加on_click方法吗?
- 20. 我们可以禁用AOP调用吗?
- 21. 我可以在对象而不是类中调用GORM“find”方法吗?
- 22. 为什么可以在对象上调用多个方法?
- 23. 当我拥有一个对象时,我可以调用静态java方法吗?
- 24. 如何在对象上调用'!='方法?
- 25. 我们可以在android的异步任务的doinbackground方法中一次调用两个方法吗?
- 26. Flex 3方法可以检测调用对象吗?
- 27. 类方法singleton对象可以响应委托调用吗?
- 28. 我可以在Android的getView()方法中调用setContentView()方法吗?
- 29. 我们可以在C#项目中使用COM对象吗?
- 30. JavaFX并发性:我可以在任务中运行对象方法吗?
那么你肯定*可以* ...只是因为你得到一个'NullPointerException',方法不能被执行。 – 2011-05-02 08:53:49