将字符串转换为hasthtable会产生NullPointerException

时间:2011-09-17 08:35:56

标签: java nullpointerexception hashtable type-conversion

我正在编写一个代码,用于读取json中的文件并将其转换为哈希表。

但是当我尝试将String转换为哈希表时,我有一个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();
    }

}

3 个答案:

答案 0 :(得分:2)

没有任何内容在readjsonString之间设置:

String readjsonString = null;

if(readjsonString.isEmpty()){

因此,您所追捕的第一个例外是预期的,而您正在做的是良好做法。如果预期readjsonString为空(如此处所示),请检查该内容。

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

如果你使用StringBuilder会更好 - 这就是它的用途。

仅当gson为空时,第二个NPE才会完全发生 。该变量未在您发布的内容中定义或设置,因此无法知道这是否可行。

如果内部发生 fromJson方法调用,可能是因为您根本没有读取任何输入,因此readjsonString仍然为空。所以切换到StringBuilder并停止使用异常进行正常流控制,你应该没问题。

如果这不能解决您的问题,则需要发布堆栈跟踪。

答案 1 :(得分:1)

是的...当您第一次访问readJsonString时,您只是为其分配了值null。有效:

String readjsonString = null;

...
if(readjsonString.isEmpty())

为什么会抛出异常?尝试:

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

你绝对应该 在这里捕捉NullPointerException

答案 2 :(得分:0)

您正在将readjsonString初始化为null,然后在其上调用方法isEmpty()。这就是抛出NullPointerException的原因。请注意,null与空字符串""不同。

如果您希望readjsonString开始为空,请使用String readjsonString = "";

否则,您应该使用null

来检查if (readjsonString == null)

我不确定你为什么以{1}}的方式捕捉到这种情况 - 永远不应该抓住这个异常,因为它总是表明存在错误。

编辑:我认为构建NullPointerException的逻辑可能存在缺陷。请尝试以下方法:

readjsonString

StringBuilder

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
}