首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Java修饰符和NullPointerException

Java修饰符和NullPointerException
EN

Stack Overflow用户
提问于 2013-02-15 03:24:07
回答 3查看 124关注 0票数 0

我的Java代码中出现了一个运行时错误,我正试图了解其背后的原因。双星号之间的两个静态访问修饰符是所讨论的项目。代码使用或不使用这些修饰符进行编译(当然,星号去掉了)。但在运行时,它只在出现修饰符时才运行,没有错误。为什么会这样呢?当不存在静态修饰符时在运行时生成的错误粘贴在代码下面。非常感谢你的帮助!

以下是代码:

代码语言:javascript
复制
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!");

    }

}

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

代码语言:javascript
复制
Exception in thread "main" java.lang.ExceptionInInitializerError
Caused by: java.lang.NullPointerException
    at Blue.<init>(Blue.java:13)
    at Blue.<clinit>(Blue.java:11)
EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2013-02-15 03:50:26

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

但是,如果您将int one声明为非静态,当JVM试图创建静态 Blue blueobject时,它必须创建一个完全初始化的Blue对象并将其分配给静态 blueObject,因此它尝试初始化int;但此时,静态还没有准备好。

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

票数 0
EN

Stack Overflow用户

发布于 2013-02-15 03:36:06

因为您将blueObject声明为静态的,所以将定义更改为:

代码语言:javascript
复制
Test blueObject = new Test();

它就会跑!

无论是在“单例模式”(一切都是静态的)还是在“对象模式”(创建对象并通过对象调用类方法)中工作,都不能两者兼得。

票数 0
EN

Stack Overflow用户

发布于 2013-02-16 01:46:24

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

代码语言:javascript
复制
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();
    }
}

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

代码语言:javascript
复制
initializing static field
constructor of class Test
constructor of class Test

但是,在您的代码中,静态变量的类型是Blue本身。这就像静态蓝色blueObject的初始化依赖于int one的初始化,这实际上需要静态蓝色blueObject。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/14887820

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档