0

我的 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)
4

3 回答 3

0

这是因为您将 blueObject 声明为静态,将定义更改为:

Test blueObject = new Test();

它会运行!

要么在“单例模式”(一切都是静态的)下工作,要么在“对象模式”(你创建一个对象并通过对象调用类方法)下工作——你不能同时拥有这两者。

于 2013-02-15T03:36:06.137 回答
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 本身的类型。并且它变得像静态 Blue blueObject的初始化取决于int[][]的初始化,这实际上需要静态 Blue blueObject

于 2013-02-16T01:46:24.050 回答
0

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

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

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

于 2013-02-15T03:50:26.703 回答