当我尝试从方法访问私有变量时,为什么私有变量变为null?

时间:2019-05-08 08:34:10

标签: java

我正在尝试访问在类中生成的char数组。但是,当我尝试通过以下方法访问此数组时,它变为null。我该如何解决?

public class DnaSequence {

  private char[] dna;

  public DnaSequence(char[] dna) {
    /**
      * I generated my dna array here and has been tested
      */
  }

  public int length() {
    /**
      * This is the part I'm trying to access that array but got a null
      */
    return dna.length;
  }
}

这是我使用的测试代码:

public class DnaSequenceTest {

  public static void main(String[] args) {

    char[] bases = { 'G', 'A', 'T', 'T', 'A', 'C', 'A' };
    DnaSequence seq = new DnaSequence(bases);

    int test = seq.length();
    System.out.println(test);
  }
}

并得到一个空指针异常。

3 个答案:

答案 0 :(得分:1)

如果在构造函数中未为this.dna分配值,则永远不会从null更改其值。

任何对dna的引用(在开始时都是this.的引用)都是引用传递给构造函数而不是dna实例变量的参数

public DnaSequence(char[] dna) {
 /**
   * I generated my dna array here and has been tested
   */
   this.dna = ... // You need to assign to see it, probably this.dna = dna;
                  // that will set the dna instance variable equals 
                  // to the dna parameter passed calling the constructor
}

答案 1 :(得分:0)

我认为您正在弄乱变量的范围。

问题在于dna变量的范围。

在函数DnaSequence(char [] dna)中,您使用了与上面声明的变量不同的dna变量。

在类内部(方法上方)声明的变量称为实例变量,而在方法内部的一个内部变量称为局部变量。 如果要访问与本地变量同名的实例变量,则需要使用“ this”关键字。

例如:

public class DnaSequence {

private char[] dna; //Instance Variable

public DnaSequence(char[] dna) {  // Local Variable
/**
  * I generated my dna array here and has been tested
  */
  System.out.println(dna); // Will access the local variable
  System.out.println(this.dna); // Will access the instance variable
}

public int length() {
/**
  * This is the part I'm trying to access that array but got a null
  */
return dna.length; // Will access the instance variable
}
}

因此,如果没有 this 关键字,则如果您访问dna,它将不会更新您的实例变量,我认为您希望更新该变量。 由于尚未初始化,因此它将打印为null。

答案 2 :(得分:0)

问题是我按照您的描述创建了字段(String 对象),然后在我的构造函数中,我没有为私有变量赋值,而是再次使用 String 关键字,基本上是重新创建了变量。

检查你的构造函数,看看你是否初始化了两次!