Java Access Modifier和NullPointerException

时间:2013-02-15 03:24:07

标签: java nullpointerexception access-modifiers

我的Java代码中出现运行时错误,我正在尝试理解它背后的原因。双星号之间的两个静态访问修饰符是有问题的项目。代码编译有或没有这些修饰符(当然删除了星号)。但是在运行时,只有在存在修饰符时它才会运行而没有错误。为什么是这样?将静态修改器不存在时在运行时生成的错误粘贴在代码下方。非常感谢你的帮助!

以下是代码:

public class Blue {


    public int[][] multiArray(int x, int y){

        int[][] myArray = new int[x][y];
        return myArray;

    }

    static Blue blueObject = new Blue();

    public **static** int[][] one = blueObject.multiArray(3,3); 
    public **static** int[][] two = blueObject.multiArray(3,3);

    public static void main(String[] args){

        System.out.println("Hello world!");

    }

}

在运行时生成的错误没有静态访问修饰符:

Exception in thread "main" java.lang.ExceptionInInitializerError
Caused by: java.lang.NullPointerException
    at Blue.<init>(Blue.java:13)
    at Blue.<clinit>(Blue.java:11)

3 个答案:

答案 0 :(得分:0)

这是因为你将blueObject声明为static,将定义改为:

Test blueObject = new Test();

它会运行!

以“单例模式”(一切都是静态的)或“对象模式”(你创建一个对象并通过对象调用类方法)工作 - 你不能同时拥有它们。

答案 1 :(得分:0)

该问题与JVM如何处理类加载以及如何定义类有关。 当你有 static int [] []之一时,它的工作原理是因为JVM读取/加载静态代码的顺序与它们在类中表示的顺序相同。因此,当JVM尝试初始化int [] []之一时, static Blue blueObject就可以使用了。

但是,如果将int [] [] one声明为非静态,则当JVM尝试创建静态蓝色时 blueObject,它必须创建一个完全初始化的Blue对象并将其分配给 static blueobject,因此它尝试初始化int [] [];但此时,您的静态 blueObject .multiArray(3,3);尚未准备好。

我希望这对你的问题有意义。

答案 2 :(得分:0)

@ user1419674 通常 JVM将首先初始化静态变量,然后初始化实例变量。而且,静态变量在第一次调用代码时只初始化一次。

public class Test {
    public Test(){
        System.out.println("constructor of class Test");
    }
}

public class App {
    private Test test = new Test();
    private static int s_i;
    static {
        s_i = 1;
        System.out.println("initializing static field");
    }

    public static void main(String args[]) {
        App app1 = new App();
        App app2 = new App();
    }
}

上面运行的代码将打印出来:

initializing static field
constructor of class Test
constructor of class Test

但是,在您的代码中,静态变量的类型为Blue本身。并且它变得像静态蓝色blueObject 的初始化取决于 int [] [] one 的初始化,其中true需要 static Blue blueObject