2011-10-19 24 views
-3

我在將掃描文件中的元素添加到字符串集中時收到NullPointerException。Set.add()NullPointerException

public class ChrisCorpManifests implements Manifests { 
Set<String> _employees; 

@Override 
public Set<String> getEmployees() throws FileNotFoundException { 
    Scanner s = null; 
    String string; 
    try { 
     s = new Scanner(new BufferedReader(new FileReader("EmployeeManifest.csv")));    
     s.useDelimiter("\n"); 
     while (s.hasNextLine()) { 
      string = s.nextLine(); 
      System.out.println(string); 
      _employees.add(string); 
     } 
    } finally { 
     if (s != null) { 
      s.close(); 
     } 
    } 
    return _employees; 
} 

我收到了NullPointerException異常在這條線:

_employees.add(string); 

爲什麼我可以打印字符串,但不能將其添加到字符串設定?

+0

我假定字符串都是唯一的? –

+0

_employees來自哪裏? – danpaq

+0

'_employees'爲空嗎? –

回答

4

Set<String> _employees爲空。

+0

是的,從代碼看,它看起來像集合本身可能爲null(取決於您錯過了其他構造函數/方法)。 –

0
Set<String> _employees = new HashSet<String>(); 

現在它會工作。

順便說一下,由於_employees是在方法getEmployees之外聲明的,因此對每個對ChrisCorpManifests具體實例的getEmployees調用都會添加到前一個調用的結果中。因此,第一個呼叫將返回一個集合{A,B,C},然後下一個呼叫{A,B,C,D},然後{A,B,C,D,E,F,G}等等。確保這是你的意圖。這對我來說看起來有點奇怪。

2

一個簡單直觀的方式,以確定一個空指針異常是是尋找一個點(。)。一旦找到,你就知道最有可能的是,它的左邊是空的。如果線上有多個點,這不會有幫助,在這種情況下,你不會知道。

但在你的情況下,線

_employees.add(string); 

只有一個點,讓您擁有一個明顯跡象表明_employees爲空。

爲了解決這個問題,改變你的一套聲明:

Set<String> _employees = new HashSet<String>(); 


作爲StephenC在評論中指出,它也可能得到在其他情況下一個NPE。然而,上面提到的這個一般經驗法則是有效的。 目的是成爲一個視覺指標 - 反射 - 如何在大多數情況下快速識別NPE

+0

不幸的是,您也可以在沒有點的語句/表達式中引入NPE。認爲拆箱... –

0

如果對象是空,您可以創建一個實例:

if (_employees == null) { 
    _employees = new HashSet<String>(); 
}