我要回到java中的OOP。在这里我遇到了一个简单的例子问题:
class CreateString {
private String name;
public CreateString(String name) {
this.name = name;
}
String string = new String(name);//AAA
}
public class Main {
public static void main(String[] args) {
CreateString myName = new CreateString("tomjas");
}
}
我从表示为“AAA”的行获得了NullPointerException。当我将第二行改为
时 private String name="";
没关系。这段代码出了什么问题?我认为该字段是初始化的,因为可以从构造函数中得出结论。有关文档的任何提示和指示吗?
答案 0 :(得分:6)
您的string
变量是一个类属性。因此,它将在创建类实例时初始化。但是那时name
仍为空,因为您只在构造函数中为name
赋值。所以最终会出现NullPointerException。
要解决此问题,请将string = new String(name);
移至构造函数中:
class CreateString {
private String name = null;
private String string = null;
public CreateString(String name) {
this.name = name;
string = new String(name);
}
}
由于构造函数仅在初始化所有属性后执行,因此放置行private String string;
的位置无关紧要。你也可以把它放在构造函数之后(正如你所做的那样),它仍然没问题。
答案 1 :(得分:4)
所有字段都在构造函数之前初始化,因此当初始化string
的行name
仍然为空时
class CreateString {
private String name; //<--runs first
public CreateString(String name) { //<--runs third
this.name = name;
}
String string = new String(name);//AAA <---runs second
}
您可以在构造函数中移动string
初始化来解决此问题
class CreateString {
private String name;
String String string;
public CreateString(String name) {
this.name = name;
string;= new String(name);//AAA
}
}
答案 2 :(得分:1)
String string = new String(name);//AAA
该行在初始化程序块中。因此默认值为null
,因为您在分配某个值之前使用它。将该行移动到构造函数。
答案 3 :(得分:0)
由于您没有为您的类定义任何基类,因此执行顺序为:
因为在执行这个时
String string = new String(name);//AAA
因为它首先执行。
变量name
仍为null
。这就是它抛出NullPointerException