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

但是,当我尝试将String转换为hashtable时,出现了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();
    }

}

最佳答案

在以下之间没有设置readjsonString

String readjsonString = null;


和:

if(readjsonString.isEmpty()){


因此,您所捕捉到的第一个异常是预料之中的,而您所做的根本不是一种好习惯。如果期望readjsonString为空(如此处所示),请进行检查。

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


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

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

如果在fromJson方法调用内部发生异常,则可能是因为您根本没有读取任何输入,因此readjsonString仍为null。因此,切换到StringBuilder并停止使用用于正常流控制的异常,您应该可以。

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

08-03 23:33