我的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)发布于 2013-02-15 03:50:26
这个问题与JVM如何处理类加载以及如何定义类有关。当您有静态 int时,它可以工作,因为JVM读取/加载静态代码的顺序与它们在类中表示的顺序相同。因此,当JVM尝试初始化int时,静态 Blue blueObject就可以使用了。
但是,如果您将int one声明为非静态,当JVM试图创建静态 Blue blueobject时,它必须创建一个完全初始化的Blue对象并将其分配给静态 blueObject,因此它尝试初始化int;但此时,静态还没有准备好。
我希望这对你的问题有意义。
发布于 2013-02-15 03:36:06
因为您将blueObject声明为静态的,所以将定义更改为:
Test blueObject = new Test();它就会跑!
无论是在“单例模式”(一切都是静态的)还是在“对象模式”(创建对象并通过对象调用类方法)中工作,都不能两者兼得。
发布于 2013-02-16 01:46:24
@user1419674 通常会先初始化静态变量,然后初始化实例变量。而且,在第一次调用代码时,只初始化一次静态变量。
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的初始化,这实际上需要静态蓝色blueObject。
https://stackoverflow.com/questions/14887820
复制相似问题