-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) isその上でnull -> can't invoke.getStd()`によって返される値
  • によって返される値getStd()は->それnullを呼び出すことはできません.toString()

NPEこれはすべて、同じ行にスローされます。

良くありませんが、これらすべてをnull1 つずつ確認する必要があります。ビジネス ロジックによっては、いくつかのケースを別の方法で処理したい場合があります。たとえば、いずれかが 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 に答える