2012-07-06 101 views
0

我正在構建一個服務器,向客戶端發送問題,然後從它們接收答案,但是當我向客戶端發送問題時,我想讓它再次發送一小時不可行,我的意思是之後我發送一個問題給客戶端,我想一小時,這個問題就會永遠不會給任何其他客戶端,Java HashTable空指針異常

static Hashtable<Integer, List<Integer>> unavialbeQuestions = 
new Hashtable<Integer, List<Integer>>(); 

關鍵是ClientID的,價值是問題的ID,將永遠不會發送到列表那個客戶在一個小時內,這個功能我用來提出問題,因爲這個功能有問題

public void setUnavialbeQuestion(final String cellName, final int questionID) { 
     List<Integer> cells = getCellsIntersectedWithCell(cellName); 
     int cellID = getCellID(cellName); 
     cells.add(cellID); 
     for (int i = 0; i < cells.size(); i++) { 
      if (unavialbeQuestions.containsKey(cellID)) { 
       unavialbeQuestions.get(cells.get(i)).add(questionID); 
      } else { 
       List<Integer> lll = new LinkedList<Integer>(); 
       lll.add(questionID); 
       unavialbeQuestions.put(cellID, lll); 
      } 
      Timer timer = new Timer(); 
      timer.schedule(new TimerTask() { 
       @Override 
       public void run() { 
        // TODO Auto-generated method stub 
        f(cellName, questionID); 
       } 
      }, 1000 * 120); 
     } 
    } 

看一小時後,將解僱(在我的演示只是2分鐘)功能f(),這裏的問題是,我在執行f()功能時得到了空指針異常:

protected void f(String cellName, int questionDI) { 
     // TODO Auto-generated method stub 
     List<Integer> cells = getCellsIntersectedWithCell(cellName); 
     int cellID = getCellID(cellName); 
     cells.add(cellID); 

     for(int i=0;i<cells.size();i++){ 
      int index = unavialbeQuestions.get(cells.get(i)).indexOf(questionDI); 
      unavialbeQuestions.get(cells.get(i)).remove(index); 
     } 
    } 

index參數外, 我究竟做錯了什麼?

+0

將有助於有NPE堆棧跟蹤 – andersoj 2012-07-06 11:26:33

+0

@andersoj我不知道NPE – Totti 2012-07-06 11:27:28

+0

NPE = NullPointerException異常 – assylias 2012-07-06 11:27:39

回答

2

你不檢查返回的列表不是空的位置:

unavialbeQuestions.get(cells.get(i)).indexOf(questionDI); 

這裏:

unavialbeQuestions.get(cells.get(i)).remove(index); 

你在這裏使用不同的密鑰對您的地圖:

if (unavialbeQuestions.containsKey(cellID)) { 

and here:

unavialbeQuestions.get(cells.get(i)).add(questionID); 

(和你的代碼是不是線程安全的,也有)

+0

'unavialbeQuestions.get(cells.get(i))。indexOf(questionDI);'肯定它不是null,因爲我在'setUnavialbeQuestion'中添加它, – Totti 2012-07-06 11:32:13

+0

同步但不是線程安全的,最壞的情況:) – 2012-07-06 11:35:17

+0

線程永遠不會觸發,如果它爲空,檢查循環,胎面在循環中開始工作 – Totti 2012-07-06 11:35:17

1

unavialbeQuestions或單元列表可能是null。如果你正試圖訪問它的方法,它會拋出NullPointerException

+0

'索引'變量的異常 – Totti 2012-07-06 11:32:49

+0

@Totti只是在語句前打印unavialbeQuestions unavialbeQuestions.get(cells.get(i))。indexOf(questionDI); – 2012-07-06 11:36:44

+0

謝謝,我得到了上面的答案,再次感謝你,我upvoted – Totti 2012-07-06 11:45:53