我有这个类用于从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!";
}
}
答案 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。