当我运行此代码时,我在行text-decoration-color
如果我在调试模式下运行,它会在相同的行上停止,但在变量选项卡中,int length = origin.length();
值可能是,即main方法中的值。
那么为什么NullPointerException会在运行时出现?
origin
答案 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;
}
...