我的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)
答案 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