Java 我们可以对空对象调用任何方法吗?

Java 我们可以对空对象调用任何方法吗?,java,null,method-call,Java,Null,Method Call,可能吗 Object obj=null; obj.someMethod(); someMethod{/*some code here*/} 不我们不能。只要方法不是静态的,它就会抛出NullPointerException。如果方法是静态的,它将运行 阅读以下内容:否。在Java中,null不是对象。您无法执行 null.someMethod() “obj”变量未引用堆上的任何实例。因此,您将在运行时得到一个nullpointerexception。甚至您的JavaIDE(Eclipse、

可能吗

Object obj=null;

obj.someMethod();

someMethod{/*some code here*/}
我们不能。只要方法不是静态的,它就会抛出NullPointerException。如果方法是静态的,它将运行


阅读以下内容:

否。在Java中,null不是对象。

您无法执行


null.someMethod()

“obj”变量未引用堆上的任何实例。因此,您将在运行时得到一个nullpointerexception。甚至您的JavaIDE(Eclipse、IDEA)也会发现这个问题并警告您。

除非将某个方法声明为静态,否则这将始终抛出一个
NullPointerException
。但是,对实例调用静态方法是一种非常糟糕的做法。

您可以对空指针调用静态方法。在静态方法调用中,指针自然会被完全忽略,但在某种情况下(不查看类定义)似乎会导致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++”那样的“低级语言”。它允许在调用端报告错误,而不是在方法本身内部导致无法解释的segfault/whatnot。

这不会编译,因为对象没有
someMethod()
。但是如果你说的是

MyClass o = null;
o.someMethod();
答案取决于某个方法是否是静态的。如果它是静态的,则忽略该值,不管它是否为null

e、 g

运行正常,无异常。

空对象不存在。在您的示例中,有一个变量(指针),可以存储对实例的引用,也可以不存储任何内容

如果它不指向实例,那么我们就不能用它来调用方法或访问字段


等待,等待-编译并运行:

Math m = null;
System.out.println(m.max(1,2)); 

我们可以调用静态方法并访问任何变量中的静态字段(我们只需忽略编译器/IDE警告!)但是这是不同的,静态方法/变量不是在实例上调用/访问的,而是在类本身上调用/访问的。

不,没有办法在
null
引用上调用方法(除非该方法是静态的!)(
null
不表示某个“基本”对象,它表示一个根本不指向任何对象的引用。)

但是,这样做很好():


:

15.12.4.4查找要调用的方法
方法查找的策略取决于 在调用模式上

[……]

如果调用模式为
静态
,则不需要目标引用,也不允许重写。要调用的是类
T
的方法
m

否则,将创建一个实例方法 调用,并且存在一个目标 引用。如果目标引用为
null
,将抛出一个
NullPointerException
此时。
否则,目标 reference是指一个目标 对象,并将用作值 在调用的 方法

[……]


如果方法是静态的,则可以调用,因为静态方法是在编译时绑定的,并且静态绑定只使用变量类型,而不是对象的值


如果您对非静态方法尝试相同的方法,请准备捕获空指针异常。

当然可以……只是当您获得
NullPointerException时,该方法无法执行。
+0:如果someMethod()是静态的,则不会执行。@Nirmal,我建议您尝试。请参见我的示例。;)不是这样,而是
((ClassWithStaticMethod)null).someMethod()
工作正常;-)应该注意的是,从这样一个变量调用
静态
方法几乎被普遍认为是不好的风格:当没有关系时,它意味着一种关系。为什么几乎?您知道它在哪种情况下更受欢迎吗?@aioobe您可能希望指出它属于“附近”的变量,而不必解析该变量具有此静态类所属的特定类型。而不是静态方法。IDE经常标记这一点是正确的。
Math m = null;
System.out.println(m.max(1,2)); 
class MethodTest {
    static void someMethod() {
        System.out.println("Hello World");
    }
}

class Test {
    public static void main(String[] args) {
        MethodTest mt = null;
        mt.someMethod();
    }
}