-6

我调用了提供学生信息列表的 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(); 

在执行它时。

4

3 回答 3

3

NullPointerException当您尝试访问类实例的方法或变量时抛出,但实际上并不存在实例 - 所以您要处理的对象是null.

以这一行为例:

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

这可能在几个地方出错:

                String ID = si.getInfo().get(i).getStId().toString();
        // Possible nulls     ^         ^      ^         ^
  • si可以null-> 不能调用.getInfo()
  • 返回的值getInfo()null-> 不能调用.get(i)
  • get(i) isnull -> can't invoke.getStd()`返回的值
  • 返回的值getStd()null-> 不能调用.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);

也推荐考虑

于 2013-09-10T12:30:33.483 回答
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,因为您最初没有为这些字段提供任何值。

请提供异常的堆栈信息

于 2013-09-10T12:34:08.237 回答
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()
于 2013-09-10T12:38:13.847 回答