首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >为什么我得不到NullPointerException?

为什么我得不到NullPointerException?
EN

Stack Overflow用户
提问于 2012-10-01 05:55:38
回答 6查看 758关注 0票数 16

可能重复:

Static fields on a null reference in Java

我知道静态方法是在类级别上的。所以我意识到我不需要创建实例来调用静态方法。但我也意识到我可以像调用实例方法一样调用静态方法。这就是我感到困惑的地方,因为在从空对象调用静态方法时(就像调用实例方法一样),我需要一个NullPointerException。如果能解释一下为什么我在这里期望一个NullPointerException是错误的,我会非常感激。

以下是示例代码:

public class SampleClass {

    public static int getSumStatic(int x, int y){
        return x+y;
    }

    public int getDifferenceInstance(int x, int y){
        return x-y;
    }
}

public class TestClass {

    public static void main (String[] args){        
    SampleClass sc=null;

    System.out.println(SampleClass.getSumStatic(2, 2)); //as expected

    //I was expecting NullPointerException in the next line, since I am accessing null object
    System.out.println(sc.getSumStatic(4,5)); //static method , executes perfectly  

    System.out.println(sc.getDifferenceInstance(6,4));//throws NullPointerException
    }
}
EN

回答 6

Stack Overflow用户

回答已采纳

发布于 2012-10-01 05:58:34

通过实例调用静态方法不需要实例在那里。只要编译器能够确定变量的类型,它就会在计算sc表达式并丢弃结果后静态地进行等效调用:

System.out.println(SampleClass.getSumStatic(4,5));

Java Language Specification

第15.12.1节

如果表单为Primary.NonWildTypeArgumentsopt Identifier,则方法的名称为❖。设T是主表达式的类型。如果T是类或接口类型,则要搜索的类或接口是T,如果T是类型变量,则是T的上界。

第15.12.4.1节:

  1. 如果涉及MethodInvocation的第二个生产,则有两个子案例:

❖如果调用模式是静态的,则没有目标引用。将对表达式Primary求值,但随后会丢弃结果。

票数 14
EN

Stack Overflow用户

发布于 2012-10-01 06:06:30

这是java设计者的某种设计错误。您应该在类上调用静态方法,因为它属于类而不是对象。

您可以在why-isnt-calling-a-static-method-by-way-of-an-instance-an-error-for-the-java-co上看到有关此问题的一些信息

有趣的是,在未初始化的对象变量上调用静态方法是不可能的。但是如果对象被初始化为null,那么一切都是正常的。

我认为这是可行的,因为用这个变量存储的对象通过赋值提供了类型信息。

SampleClass sampleObject;
sampleObject.getSumStatic(2, 2) 

不会编译,因为对象未初始化,因此在java编译器的语法树中没有设置任何类型信息。

票数 3
EN

Stack Overflow用户

发布于 2012-10-01 05:59:46

Java将允许您简单地基于引用来访问静态方法,即使引用是null。只有引用的类型是重要的。

通常应该使用类名来调用静态方法:

SampleClass.getSumStatic(2, 2);
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/12665474

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档