2012-09-25 54 views
0

我正在做一个程序中存在问题,我无法弄清楚问题所在。我已经做了几个较小的测试类来试图找出问题所在,但我没有得到它。我确信这是关于Arrays如何工作或什么的一些基本的事情,但我似乎无法记住什么。所以我在这里发布课程,希望你们知道什么是错的。谢谢!为什么我会得到NullPointerException?

public class Main { 

    public static void main(String[] args) { 
     TestArray t = new TestArray(8); 
     t.set(1, 15); 
     t.print(); 
    } 

} 


public class TestArray { 
    private Word[] a; 

    public TestArray(int i){ 
     a = new Word[i]; 
    } 

    public void set(int pos, long value){ 
     a[pos].set(value); 
    } 

    public void print(){ 
     for(Word w : a){ 
      System.out.println(w); 
     } 
    } 
} 



public class Word { 
    private long value; 

    public Word(long value){ 
     this.value = value; 
    } 

    public void set(long value){ 
     this.value = value; 
    } 

    public String toString(){ 
     return String.valueOf(value); 
    } 
} 

这是当我尝试做t.set(1,15)的错误occours和Eclipse说什么是错与线:A [POS] .SET(值);

+1

发布堆栈跟踪。你打算怎么做? – eboix

回答

4

您并未初始化Word[] a变量的实际元素。如果它们在您的TestArray.set方法中为空,请将它们初始化。

if (a[pos] == null) 
    a[pos] = new Word(value); 
else 
    a[pos].set(value); 

Java中的对象阵列的值被初始化为null,这是违背基本数组如何被初始化(为全零或其等价物)。所以当你通过new Word[i]创建数组时,实际上是创建了一个null元素的数组,你必须相应地设置它们。

的设置方法做它确保你没有创建任何未使用的Word对象。这被称为lazy initialization。另一种方式来做到这一点。将它们全部初始化在构造函数中的一些默认值:

public TestArray(int i){ 
    a = new Word[i]; 
    for (int index = 0; index < i; index++) { 
     a[index] = new Word(0); // Or some other default besides 0, like -1 
    } 
} 

每您的评论:

这似乎是最好的方式,但我真的试图要做:(for-each code)。在问之前,这不起作用。为什么?

您的代码:

public TestArray(int i) { 
    a = new Word[i]; 
    for(Word w:a) { 
     w = new Word(0); 
    } 
} 

不起作用,因为w并不像a[index]实际引用。在换每个阵列上的循环,你的代码实际上做这个编译时:

for (int $i = 0; $i < a.length; $i++) { 
    Word w = a[$i]; 
    w = new Word(0); 
} 

正如你所看到的,你是局部变量,w分配一个值,而不是在a实际元素,所以数组没有被改变。此言一:不要揭去由$变量,因为1)$是合法的Java变量名(虽然你不能明确地使用它们)和2)的Java产生这些变量时,它编译你的代码(它可以被看作适当的调试器)。

+0

这似乎是最好的方法,但我实际上试图做: \t public TestArray(int i){ \t \t a = new Word [i]; (Word w:a){ \t \t \t w = new Word(0); \t \t \t \t} \t} 在问这里之前,这是行不通的。为什么? – Alex

+0

我会编辑来解释为什么没有用。 – Brian

+0

@Alex更新了我的答案 – Brian

3

您分配一个数组,但你不要放置在之前的访问中元素的数组元素任何东西。

a[pos].set(value); 

试图访问[pos]中的任何内容,该内容为null。

您通过阵列需要循环,每个数组元素分配TestArray的新实例。

+0

Eric是对的,你需要用Word对象初始化每个数组。您可以在设置方法中使用tje构造函数或更好的方法来设置值 – Deian

+0

public TestArray(int i){ \t \t a = new Word [i]; (Word w:a){ \t \t \t w = new Word(0); \t \t \t \t} \t} 不起作用。 – Alex

相关问题