简单代码的奇怪错误

时间:2016-07-20 12:24:24

标签: java

当我运行此代码时,我在行text-decoration-color

上得到NullPointerException

如果我在调试模式下运行,它会在相同的行上停止,但在变量选项卡中,int length = origin.length();值可能是,即main方法中的值。

那么为什么NullPointerException会在运行时出现?

origin

4 个答案:

答案 0 :(得分:2)

初始化length变量时,

原点未初始化。将其设置为零,并像这样初始化原点:

private String origin = new String();

origin变量在通过您的setter设置之前将是null字符串。

我会替换

int length = origin.length(); //NullPointerException

通过     public int get_length(){return origin.length(); }

因此长度属性始终与实际原始长度正确相关。

答案 1 :(得分:1)

由于Java对象的生命周期:在执行构造函数中的代码之前设置了length属性,因此origin属性仍为null。

计算构造函数中的长度,以解决该问题:

public Task (String o) {
    this.origin=o;
    this.length=this.origin.length();
}

然后更新setter:

public void setOrigin(String origin) {
    this.origin = origin;
    this.length=origin.length;
}

或者只是为长度创建一个getter并且不存储该值(在我看来最好的选择):

int getLength() {
   this.origin.length();
}

答案 2 :(得分:0)

实例(和静态)变量在对super()的(隐式或显式)调用之后立即初始化。所以这是在你可以为你的String origin分配任何内容之前。

答案 3 :(得分:0)

根据不同的字段注意初始化字段! JVM尝试在调用构造函数之前初始化它们!

public static void main(String[] args) {

        String regexp = "(?:a)";
        Task t = new Task(regexp); // error
        t.process();

    }


class Task {

    private String origin;
    private int length;

    public Task() {
        //optional - depending on what you like/need
        origin = new String();
        length = 0;
    }

    public Task(String origin) {
        this.origin = origin;
        this.length = origin.length();
    }

    public void setOrigin(String origin) {
        this.origin = origin;
        this.length = origin.length(); 
    }

    public String getOrigin() {
        return origin;
    }

...