今天在学习利用JsonReader解析复杂Json时,抛出了这样的错误:
java.lang.StackOverflowError
at com.vince.json.JsonDemon2.readMessageArray(JsonDemon2.java:39)
at com.vince.json.JsonDemon2.readMessageArray(JsonDemon2.java:39)
at com.vince.json.JsonDemon2.readMessageArray(JsonDemon2.java:39)
at com.vince.json.JsonDemon2.readMessageArray(JsonDemon2.java:39)
at com.vince.json.JsonDemon2.readMessageArray(JsonDemon2.java:39)
at com.vince.json.JsonDemon2.readMessageArray(JsonDemon2.java:39)
at com.vince.json.JsonDemon2.readMessageArray(JsonDemon2.java:39)
at com.vince.json.JsonDemon2.readMessageArray(JsonDemon2.java:39)
at com.vince.json.JsonDemon2.readMessageArray(JsonDemon2.java:39)
at com.vince.json.JsonDemon2.readMessageArray(JsonDemon2.java:39)
at com.vince.json.JsonDemon2.readMessageArray(JsonDemon2.java:39)
at com.vince.json.JsonDemon2.readMessageArray(JsonDemon2.java:39)
原来是“StackOverflow 这个问题一般是程序里可能是有死循环或递归调用所产生的;”
我写的代码如下:
private ArrayList<Message> readMessageArray(JsonReader jsonReader) {
ArrayList<Message> list = readMessageArray(jsonReader);
try {
jsonReader.beginArray();
while(jsonReader.hasNext()){
list.add(readMessage(jsonReader));
}
jsonReader.endArray();
} catch (IOException e) {
e.printStackTrace();
}
return list;
}
private ArrayList<Message> readMessageArray(JsonReader jsonReader) { ArrayList<Message> list = readMessageArray(jsonReader); try { jsonReader.beginArray(); while(jsonReader.hasNext()){ list.add(readMessage(jsonReader)); } jsonReader.endArray(); } catch (IOException e) { e.printStackTrace(); } return list; }
看了下代码,
一个很严重的问题是方法里面的第一行:
ArrayList<Message> list = readMessageArray(jsonReader);
这里“readMessageArray(jsonReader)”与方法readMessageArray(JsonReader jsonReader)形成了递归,死循环,出不来了。
后面还有第只写了“jsonReader.beginArray();”,但是没有写“jsonReader.endArray();”
这导致数组解析始终不能结束。
以后还是要注意,这种成对出现的语法,在开始写前部的时候就应该把对应的后部写上。