我们可以在空对象上调用任何方法吗?
没有我们不能。只要方法不是静态的,它将抛出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
的值 。[...]
是你可以调用,如果因为静态方法是在编译时的约束,唯一的变量的类型用于静态绑定不是对象的值的方法是静态的。
如果您对非静态方法尝试相同,则准备好捕获空指针异常。
那么你肯定*可以* ...只是因为你得到一个'NullPointerException',方法不能被执行。 – 2011-05-02 08:53:49