我有一个函数“getStudent()”返回一个字符串的ArrayList,当我在另一个类中调用这个函数时,我得到一个NullPointerException,我以为我已经正确初始化了我的List。
以下是两个函数,我得到NullPointerException的行是粗体。
public ArrayList<String> getStudents(){
try
{
System.out.println("gets here ");
Statement newStat = this.conn.createStatement(ResultSet.TYPE_SCROLL_INSENSITIVE, ResultSet.CONCUR_UPDATABLE);
ResultSet res = newStat.executeQuery("SELECT FirstName FROM Students");
String data = "";
while (res.next()){
studentList.add(res.getString("FirstName"));
}
}
catch(SQLException e){
System.err.println("SQLException: " + e.getMessage());
}
return studentList;
}
调用'getStudents()'
的函数 public class CancelListener implements ActionListener{
private Main_Menu menu;
private ArrayList<String> arrayList = new ArrayList<String>();;
Iterator iterator = arrayList.iterator();
public CancelListener(Main_Menu menu) {
this.menu = menu;
}
@Override
public void actionPerformed(ActionEvent ae) {
if(ae.getActionCommand().equalsIgnoreCase("Cancel")){
**arrayList = StudentModel.getStudents();**// NULLPOINTER EXCEPTION
while(iterator.hasNext()){
System.out.println(iterator.next().toString());
}
this.menu.resetStudent();
}
}
}
答案 0 :(得分:2)
您的StudentModel
变量可能为空。你发布的代码没有显示该变量是如何初始化的,所以我无法确切地告诉你你做错了什么,但当你到达标记的那一行时它必须为空。
在尝试使用该变量之前,应检查是否正确初始化该变量。
答案 1 :(得分:1)
您可能没有初始化StudentModel
。但我无法确定,因为这部分代码没有出现在这里。
答案 2 :(得分:0)
getStudents()不是静态的,看起来你把它称为静态方法(根据你将StudentModel大写的方式来判断。)所以,正如其他人已经说过的那样,你可能需要实例化一个StudentModel对象,然后调用instance.getStudents()。
此外,我没有看到你在哪里创建一个数组实例。 getStudents()将项添加到studentList,但我们没有看到studentList是如何初始化的。这也可能是问题所在。坦率地说,鉴于你正在做的事情,可能没有理由让studentList成为一个实例变量。所以只需在本地声明变量并在getStudents()方法中分配数组。
答案 3 :(得分:0)
你提到你认为你正确地初始化了列表,但这不是你得到的例外。此外,您可能还有其他问题 你得到一个列表的迭代器: Iterator iterator = arrayList.iterator(); 然后为该引用分配一个不同的对象: arrayList = StudentModel.getStudents(); // NULLPOINTER EXCEPTION 然后你尝试使用迭代器: 而(iterator.hasNext()){
我的理解是,这不应该导致异常,因为您没有对迭代器引用的列表进行更改。但是,您几乎肯定会在您认为自己的不同列表中进行迭代。您是否有可能错误地解释在某种程度上导致的异常?