构造函数初始化变量为null导致jdbc的NPE

时间:2014-07-24 02:01:51

标签: java

我有这个类用于从database.create构造函数中检索数据,然后将所有变量初始化为null - > NPE。所以我评论他们,像魔术一样工作。我的问题,为什么或如何发生这种情况?每次obj类都使用一个方法,它会回到构造函数,所以将所有变量设置为null?有兴趣知道。如果这么简单,我缺乏知识。感谢。

public class OptionList {

private Connection conn;
private List<String> type_list = new ArrayList<>();
private List<String> partid_list = new ArrayList<>();

public OptionList() {
    //conn = null;
    //type_list = null;
    //partid_list = null;
}

public void listin_db() throws Exception, SQLException {
    JDBC ora = new JDBC();

    //1. open/get connection
    ora.openConnection();

    conn = ora.getConn();

    //2. Execute query
    String stmnt = " select distinct PARTID, NAME "
            + " from INVENTORY tblA "
            + " inner join( "
            + " select distinct part_no "
            + " from Status )tblB on tblA.Partid = tblB.part_no ";
    Statement statement = conn.createStatement();
    ResultSet rs = statement.executeQuery(stmnt);

    while (rs.next()) {
        type_list.add((String) rs.getString("NAME"));
        partid_list.add((String) rs.getString("PARTID"));
    }

    conn.close();
    statement.close();
    ora.closeConnection();

}

public List<String> getpartid_List() {
    return partid_list;
}

public List<String> getType_List() {
    return type_list;
}

public String test() {
    return "HelooWourldd!";
}

}

2 个答案:

答案 0 :(得分:1)

首先,在声明数组成员时初始化它们:

private List<String> type_list = new ArrayList<>();
private List<String> partid_list = new ArrayList<>();

之后,构造函数将它们设置为null(在注释掉的代码中):

public OptionList() {
    //conn = null;
    //type_list = null;
    //partid_list = null;
}

然后,当您尝试向其添加字符串时,在listin_db()中,您会获得NullPointerException

while (rs.next()) {
    type_list.add((String) rs.getString("NAME"));
    partid_list.add((String) rs.getString("PARTID"));
}

您应该在声明它们时(如现在这样)或在构造函数中初始化它们,但是您不能将它们初始化为null,然后尝试访问它们。

答案 1 :(得分:1)

你的NPE将在这一行

type_list.add((String) rs.getString("NAME"));

因为你在构造函数中将type_list设置为null。

初始化像这样的实例变量时

private List<String> type_list = new ArrayList<String>();

它等同于构造函数中的这段代码

public OptionList() { 
    this.type_list = new ArrayList<String>();
 }

这意味着当迭代结果集时,type_list不为null。