我正在编写一个代码,用于读取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();
}
}
答案 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
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
}