NullPointerException或将打印静态变量的内容

时间:2014-11-26 11:16:20

标签: java static nullpointerexception static-members

我遇到了以下代码:

public class TradingSystem {

    private static String category = "electronic trading system";

    public static void main(String[] args) {
        TradingSystem system = null;
        System.out.println(system.category);
}

Output: 电子交易系统

我很惊讶没有找到NullPointerException!

Q1。为什么它没有抛出NullPointerException

Q2。或者在编译时,由于具有static的类别声明使得用TradingSystem替换系统(即对象引用),因此基本上调用了TradingSystem.category

4 个答案:

答案 0 :(得分:7)

Java允许使用实例语法访问类变量(即static个)。换句话说,编译器允许您编写system.category,但它将其解析为TradingSystem.category,它独立于访问它的实例。

这就是为什么你没有得到NullPointerException。但是,这种语法不易读取和混淆。这就是为什么您应该收到警告并建议使用TradingSystem.category代替system.category

答案 1 :(得分:3)

您的代码在概念上与以下代码没有区别。

public class TradingSystem {

    private static String category = "electronic trading system";

    public static void main(String[] args) {
        System.out.println(TradingSystem.category);

    }
}

即使您似乎使用系统对象引用,您实际上也在使用静态值。 Java允许在使用静态时使用实例,但您应该更喜欢上面的语法,以便明确使用静态的。

答案 2 :(得分:1)

您永远不应该使用类实例调用静态方法,也不需要它。由于静态方法是在类级别执行的,因此不使用该实例,因此不会抛出空指针异常。

答案 3 :(得分:1)

静态被称为“OF CLASS”不是为了类的对象。所以这里

的System.out.println(system.category); “系统充当TradingSystem”

哪个是对的。因为您不需要实例化对象来唤起静态标记的字段或方法。