【问题标题】:Initialising an instance variable with a method from the class使用类中的方法初始化实例变量
【发布时间】:2010-10-06 14:14:06
【问题描述】:

我可以在Java中初始化一个实例变量,当我声明它时初始化它,并使用我稍后在类中定义的方法的返回值来初始化它。

类似这样的:

public class MyClass {

     integers[] myArray = new integers[length()];

     int length() {
     ....

     }
}

length() 给了我一些数字,我想要这个数字来确定数组中元素的数量。这对我来说似乎是合理的,但我得到NullPointerException(我不知道这个错误初始化是否导致异常,但我不知道究竟是什么,而且因为我以前从未做过这个初始化,我不确定没错)。

【问题讨论】:

    标签: java initialization instance-variables


    【解决方案1】:

    你必须使方法静态:

    static int length() { … }
    

    【讨论】:

      【解决方案2】:

      对我来说似乎工作正常,方法是静态的还是非静态的:

      public class test
      {
          public int[] myarray = new int[this.length()];
      
          public int length() {
              return 5;
          }
      
          public static void main(String[] args)
          {
              test foo = new test();
              for (int element : foo.myarray) {
                  System.out.println(element);
              }
          }
      }
      

      产生:

      0
      0
      0
      0
      0
      

      【讨论】:

        【解决方案3】:

        在执行此操作之前,可能值得考虑一下此语法是否会稍微令人困惑,并且在构造函数或初始化块中初始化数组可能更合适。

        private final int[] myArray;
        
        public MyClass() {
            myArray = new int[length()];
        }
        

        private final int[] myArray;
        {
            myArray = new int[length()];
        }
        

        【讨论】:

          【解决方案4】:

          问题可能出在length() 方法的某个地方。我怀疑它指的是一个尚未适当初始化的变量。这是一个程序示例,它表明:

          public class MyClass {
          
              int[] myArray = new int[length()];
          
              // This is only initialized *after* myArray
              String myString = "Hi";
          
              int length() {
                  return myString.length();
              }
          
              public static void main(String[] args) {
                  new MyClass(); // Bang!
              }
          }
          

          如果这的问题,我建议你改为在构造函数中进行初始化 - 这样排序会更清晰。

          【讨论】:

          猜你喜欢
          • 2016-02-13
          • 1970-01-01
          • 2017-10-23
          • 1970-01-01
          • 2011-09-24
          • 2011-06-21
          • 1970-01-01
          • 2012-05-27
          • 1970-01-01
          相关资源
          最近更新 更多