将数据放入哈希表时获取NullPointerException

时间:2013-09-10 12:22:19

标签: java

我调用了Web服务方法,该方法提供了学生信息列表。

StudentsInfo si = getInfo(username, rollno, class); // web service method invoked
Hashtable hashStudList = new Hashtable();
int size = si.getInfo().size();

for (int i=0;i<size;i++) {
    StudentsList st = new StudentsList();
    String ID = si.getInfo().get(i).getStId().toString();
    st.setId(ID);
    st.setName(si.getInfo().get(i).getStName().toString());
    st.setAddress(si.getInfo().get(i).getStAddress().toString());
    st.setPhone(si.getInfo().get(i).getStPhone().toString());
    // ...
    hashStudList.put(ID, st);
}

StudentsList是包含getter和setter的bean类。 但它在

处给出了空指针异常
String ID = si.getInfo().get(i).getStId().toString(); 

执行时。

3 个答案:

答案 0 :(得分:3)

当您尝试访问类的实例的方法或变量时,会抛出

NullPointerException,但实际上并不存在实例 - 因此您要处理的对象是null

以这一行为例:

                String ID = si.getInfo().get(i).getStId().toString();

这可能会在几个地方出错:

                String ID = si.getInfo().get(i).getStId().toString();
        // Possible nulls     ^         ^      ^         ^
  • si可以是null - &gt;无法在其上调用.getInfo()
  • getInfo()返回的值为null - &gt;无法在其上调用.get(i)
  • get(i) is null -> can't invoke。getStd()`返回的值
  • getStd()返回的值为null - &gt;无法在其上调用.toString()

所有这些都会在同一行上抛出NPE

这不好,但你应该逐一检查null的所有这些内容。根据业务逻辑,您可能希望以不同的方式处理某些情况,例如,当其中一个为空时抛出某种异常,等等......

if(si!=null) {
  StudentInfo info = si.getInfo; //using local variable to store value for readability
  if(info!=null) {

    //... and so on
  }
  else {
     throw new MyBusinessException("Info must not be null!");
  }
}

此外,这可能是减少代码重复的一个很好的选择。您不必每次都写出所有这些si.getInfo().get(i).getStId().:您可以使用局部变量来存储导航的中间值。

<强>哈希表

Hashtable是一件旧事,你不应该用于新东西。它已被弃用。取而代之的是,请使用Map接口以及此用例的相应实现:HashMap类。此外,通过泛型,它提供了更方便的语法,省去了演员。

Map<String, StudentList> myMap = new HashMap<String, StudentList>();
.... 

myMap.put(id, studentList);

也建议考虑

答案 1 :(得分:1)

st.setName(si.getInfo().get(i).getStName().toString());
st.setAddress(si.getInfo().get(i).getStAddress().toString());
st.setPhone(si.getInfo().get(i).getStPhone().toString());

您是否设置了StAddress的值,StPhone可能是get方法返回null,因为您最初没有为这些字段提供任何值。

请提供异常的堆叠

答案 2 :(得分:0)

这里有很多可能性;

1. StudentsInfo si = getInfo(username, rollno, class);
   // Check if getInfo is returning a non null student info object?

2. String ID = si.getInfo().get(i).getStId().toString();
   // Check for Student ID getStId()
   // get(i)  
   // getInfo()