我得到了NullPointerException

时间:2013-12-02 11:09:23

标签: java nullpointerexception

我要回到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="";

没关系。这段代码出了什么问题?我认为该字段是初始化的,因为可以从构造函数中得出结论。有关文档的任何提示和指示吗?

4 个答案:

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

由于您没有为您的类定义任何基类,因此执行顺序为:

  1. 初始化此类的成员字段。
  2. 运行此类的构造函数。
  3. 因为在执行这个时 String string = new String(name);//AAA因为它首先执行。 变量name仍为null。这就是它抛出NullPointerException

    的原因