有可能吗?
Object obj=null;
obj.someMethod();
someMethod{/*some code here*/}
答案 0 :(得分: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 ++等“低级语言”区别开来的真正基本保护措施之一。它可以在调用端报告错误,而不是在方法本身内部引起一个莫名其妙的段错误。
答案 1 :(得分:4)
否 我们不能。只要方法不是静态的,它就会抛出NullPointerException。如果方法是静态的,它将运行。
阅读本文:null : Java Glossary
答案 2 :(得分:3)
没有。在Java中,null不是对象。
答案 3 :(得分:2)
“obj”变量引用堆上没有实例。因此,您将在运行时获得nullpointerexception。即使您的Java IDE(Eclipse,IDEA)也会发现问题并向您发出警告。
答案 4 :(得分: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();
}
}
15.12.4.4找到要调用的方法
方法查找的策略取决于 在调用模式。[...]
如果调用模式为
static
,则不需要目标引用,也不允许覆盖。 <{1}}类的方法m
是要调用的方法。否则,将使用实例方法 调用并且有一个目标 参考。 如果目标参考是
T
,抛出null
此时。否则,目标 据说引用是指目标 对象并将用作值 被调用的关键字NullPointerException
方法[...]
答案 5 :(得分:0)
你无法执行
null.someMethod(); !!!
答案 6 :(得分:0)
除非someMethod声明为static,否则这将始终抛出NullPointerExcpetion
。但是,在实例上调用静态方法是非常糟糕的做法。
答案 7 :(得分:0)
这不会编译,因为Object没有someMethod()
。但是,如果你在谈论像
MyClass o = null;
o.someMethod();
答案取决于someMethod是否为静态。如果它是静态的,则忽略该值,如果它为null,则无关紧要。
e.g。
Thread t = null;
t.yield();
没有例外地运行正常。
答案 8 :(得分:0)
null对象不存在。在您的示例中,您有一个变量(指针),可以存储对实例的引用,也可以不存储任何内容。
如果它没有指向实例 - 那么我们就不能用它来调用方法或访问字段。
等待,等待 - 这会编译并运行:
Math m = null;
System.out.println(m.max(1,2));
我们可以调用静态方法并访问任何变量中的静态字段(我们只需忽略编译器/ IDE警告!)但这是不同的,静态方法/变量不会被调用/访问在实例上但在类本身上。
答案 9 :(得分:0)
是如果方法是静态的,可以调用,因为静态方法在编译时绑定,只有变量类型用于静态绑定而不是object的值。
如果对非静态方法尝试相同,请准备好捕获空指针异常。