2012-02-27 66 views
0

确定我尝试在Java的ArrayList玩一段时间来尝试一些东西,我有关我project..so想出了一个简单的代码,这样ArrayList中Java的编译错误

具有3个文件... DataStruc.java ,DataStrucHand.java,testcase1.java

DataStruc.java 


public class DataStruc { 
private String testString; 

public DataStruc(String s){ 
    this.testString = s; 
} 

public String getTestString() { 
    return testString; 
} 

public void setTestString(String testString) { 
    this.testString = testString; 
} 

public String toString(){ 
    return String.format("%s",testString); 
} 
} 


DataStrucHand.java 

import java.util.ArrayList; 

    public class DataStrucHand { 
private ArrayList<DataStruc> ds; 

public void addData(String ss){ 
    ds.add(new DataStruc(ss)); 
} 

public ArrayList<DataStruc> getData(){ 
    return ds; 
} 
} 


testcase1.java 
import java.util.*; 
public class testcase1 { 
public static void main(String args []){ 
    DataStrucHand dsh = new DataStrucHand(); 

    String gdata = "test"; 

    dsh.addData(gdata); 


    } 
    } 

我试图编译它,有此错误

Exception in thread "main" java.lang.NullPointerException 
at DataStrucHand.addData(DataStrucHand.java:7) 
at testcase1.main(testcase1.java:8) 

可我知道什么是错的实际?我甚至不能添加数据...我试图添加数据并通过创建另一个testcase2.java来取回它...但是,现在向arraylist添加问题...我的目的是创建一个temp存储保留一个特定的字符串,可以通过1个程序获得但运行2个不同的类别。

回答

2

您从不向ds字段分配任何内容。

DataStrucHand.java

import java.util.ArrayList; 

public class DataStrucHand { 
    private ArrayList<DataStruc> ds; //I am null because nothing is ever new'd up here... 

    public void addData(String ss){ 
     ds.add(new DataStruc(ss)); 
    } 

    public ArrayList<DataStruc> getData(){ 
     return ds; 
    } 
} 

这一行试试:

private ArrayList<DataStruc> ds = new ArrayList<DataStruc>(); 

或者,你可以将新的它,如果你喜欢的方法构造:

public DataStrucHand() { 
    ds = new ArrayList<DataStruc>(); 
} 
+0

哦,我的上帝,感谢您的帮助......就像3.50AM在这里,我真的需要睡一觉 – user1217609 2012-02-27 19:50:55

+0

@ user1217609:您需要睡眠并学习如何调试NPE的步骤。关键是检查引发异常的行上的变量,然后回溯到代码中以查看为什么它为空。 – 2012-02-27 19:57:31

+0

@大家都需要啤酒。 – 2012-02-27 19:58:22

0

您需要将ArrayList<DataStruc>实例放入ds

0

您还没有实例化ArrayList。这样写:

public class DataStrucHand { 
    private ArrayList<DataStruc> ds = new ArrayList<DataStruc>(); 

    public void addData(String ss){ 
     ds.add(new DataStruc(ss)); 
    } 
0

你从来没有初始化ds,所以当你调用ds.add(new DataStruc(ss));添加一个构造函数来DataStrucHand初始化DS,如ds = new ArrayList<DataStruc>();为null。

0

问题是您的DataStrucHand类永远不会初始化其专用字段ds,因此当您尝试呼叫ds.add(...)时,它会失败,并显示NullPointerException

事实上,现在班级看起来的方式,ds没有办法可以是null。解决这个问题

最短的路是正确初始化ds

private final List<DataStruc> ds = new ArrayList<DataStruc>(); 

这样每个DataStrucHand实例构造有ArrayList内,ds从未null