2011-09-17 30 views
0

我正在編寫讀取json中的文件並將其轉換爲散列表的代碼。將字符串轉換爲hasthtable會產生NullPointerException

但是我有一個NullPointerException當我嘗試將字符串轉換爲散列表。

readBackInfo = gson.fromJson(readjsonString, fileInfoType); 

下面是我執行

public void readSyncFile(){ 
    String readjsonString = null; 
    readBackInfo = new HashMap<String, ArrayList<String[]>>(); 
    try { 
     FileInputStream fstream = new FileInputStream(_dirName+"/."+_dirName); 
     DataInputStream in = new DataInputStream(fstream); 
     BufferedReader br = new BufferedReader(new InputStreamReader(in)); 
     String strLine; 

     while ((strLine = br.readLine()) != null) { 
      if(readjsonString==null){ 
       readjsonString = strLine; 
      } else { 
       readjsonString = readjsonString + "\n" + strLine; 
      } 
     } 
     in.close(); 
     //System.out.println(readjsonString); 

     Type fileInfoType = new TypeToken<HashMap<String, ArrayList<String[]>>>() {}.getType(); 

     System.out.println(allFiles.isEmpty()); 

     //getting a NullPointerException from the line below! 
     readBackInfo = gson.fromJson(readjsonString, fileInfoType); 

     sFileInToHashtable(); 
     //readjsonString = gson.toJson(readBackInfo); 
     //System.out.println(readjsonString); 

    } catch (FileNotFoundException e) { 
     // TODO Auto-generated catch block 
     e.printStackTrace(); 
    } catch (IOException e) { 
     // TODO Auto-generated catch block 
     e.printStackTrace(); 
    } 

} 
+0

當提問有關獲取異常的問題時,在問題中包含堆棧跟蹤總是一個好主意。 –

回答

2

沒有被設置之間readjsonString 。如果預計readjsonString爲空(就像它在這裏),檢查一下。

if (readjsonString == null) { 
    readjsonString = strLine; 
} else { 
    ... 
} 

如果您使用StringBuilder這將會更好 - 這就是它的目的。

僅當gson爲空時,第二個NPE纔會正好發生。該變量沒有在您發佈的內容中定義或設置,因此無法知道這是否可行。

如果異常發生fromJson方法調用,這可能是因爲你根本看不輸入readjsonString會因此仍然爲空。所以切換到StringBuilder並停止使用正常流量控制的異常,你應該沒問題。

如果這不能解決您的問題,您需要發佈堆棧跟蹤。

+0

我忘了添加'gson = new GsonBuilder()。setPrettyPrinting() .create();'!, thanx ^^現在解決它 – Leanne

+0

你應該_really_考慮我和其他人的建議。使用正常流量控制的例外是**不是很好的做法。 – Mat

0

你初始化readjsonStringnull,然後調用它的方法isEmpty()的代碼。這是拋出NullPointerException。請注意,null與空字符串""不相同。

如果你想readjsonString開始是空的,使用String readjsonString = "";

否則,你應該檢查null而是使用if (readjsonString == null)

我不知道爲什麼你正在追趕NullPointerException你的方式 - 這絕對不應該被捕獲,因爲它總是表示一個錯誤。

編輯:我認爲你的邏輯可能有一個缺陷,建立readjsonString。請嘗試以下操作:

String readjsonString = ""; 

... 

while ((strLine = br.readLine()) != null) { 
    if(!readjsonString.isEmpty()){ 
     readjsonString += "\n"; //append newline if it isn't the first line 
    } 
    readjsonString += strLine; //append line 
} 

或者與StringBuilder

StringBuilder readjsonStringBuilder = new StringBuilder(); 

... 

while ((strLine = br.readLine()) != null) { 
    if(readjsonStringBuilder.length() > 0){ 
     readjsonStringBuilder.append("\n"); 
    } 
    readjsonStringBuilder.append(strLine); 
} 
String readjsonString = readjsonStringBuilder.toString(); 
+0

noo不是那個部分,我知道我得到null pointerexception那裏,即時通訊詢問有關'readBackInfo = gson.fromJson(readjsonString,fileInfoType);' – Leanne

+0

@Leanne - 但你爲什麼捕捉循環中的NPE?爲什麼不解決第一個NPE - 這可能與第二個NPE有關,因爲你的代碼只是試圖吃掉它並繼續前進。 –

+0

是的,我正確地修復它,但仍然從readBackInfo = gson.fromJson(readjsonString,fileInfoType),異常;我將編輯我的代碼 – Leanne

1

嗯,是......你訪問readJsonString第一時間之後你只賦予它的null值。有效:

String readjsonString = null; 

... 
if(readjsonString.isEmpty()) 

爲什麼會拋出異常?嘗試:

if (readjsonString == null || readJsonString.isEmpty()) 
{ 
    ... 
} 

你絕對應該在這裏捕NullPointerException

String readjsonString = null; 

和:

if(readjsonString.isEmpty()){ 

所以你抓住,預計第一個例外,你在做什麼是好的做法都

+0

noo不是那個部分,我知道我得到null pointerexception那裏,即時通訊詢問關於'readBackInfo = gson.fromJson(readjsonString,fileInfoType);' – Leanne