2009-02-10 85 views
0

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

事情是这样的:

public class MyClass { 

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

    int length() { 
    .... 

    } 
} 

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

回答

-3

你必须做的方法静态:

static int length() { … } 
3

似乎为我工作的罚款,该方法静态或不是静态的:哪个生产

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 
+0

听起来像是一笔交易。 :) – 2009-02-10 08:15:03

2

在做这件事之前,可能值得考虑一下,如果这个语法可能有点混乱,并且它可能更适合e在构造函数或初始化块中初始化数组。

private final int[] myArray; 

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

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

机会是问题是某处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! 
    } 
} 

如果这个问题,我建议你在构造函数中的初始化,而不是 - 这样的顺序是非常清晰的。

+0

+1。这个问题在有效的java http://java.sun.com/docs/books/effective/中进行了广泛的讨论。 – Chii 2009-02-11 12:50:39