我有一个看起来很简单的问题,但我不知道它来自哪里...... 我有以下 JSon:
{
"meters": 1000,
"ivs": 95
}
我有代码:
JsonReader jsonreader = new JsonReader(new InputStreamReader(is));
jsonreader.beginObject();
while(jsonreader.hasNext()){
String name = jsonreader.nextName();
switch(name){
case "meters": {jsonreader.nextInt(); // CRASH HERE}
case "ivs": {jsonreader.nextInt(); // CRASH HERE}
default: {jsonreader.skipValue();}
}
}
jsonreader.endObject();
jsonreader.close();
当我将案例线静音时,就可以了。以下代码有效:
JsonReader jsonreader = new JsonReader(new InputStreamReader(is));
jsonreader.beginObject();
while(jsonreader.hasNext()){
String name = jsonreader.nextName();
switch(name){
//case "meters": {jsonreader.nextInt(); // CRASH HERE}
//case "ivs": {jsonreader.nextInt(); // CRASH HERE}
default: {jsonreader.skipValue();}
}
}
jsonreader.endObject();
jsonreader.close();
但我不知道为什么当我取消注释其中一个值时,代码不起作用。
编辑:我尝试调试,名称值是“meters”或“ivs”,并且我尝试在两种情况下的“nextInt()”之前插入“jsonreader.hasNext()”,并且回答为真,然后像平常一样在“nextInt()”处崩溃。
最佳答案
问题出在您的 switch
语句中:
switch(name){
case "meters": {jsonreader.nextInt();}
case "ivs": {jsonreader.nextInt();}
default: {jsonreader.skipValue();}
}
Switch 语句与 if-then
block 略有不同,因为执行通过 case 语句。当 case 匹配时,执行会跳转到该点,然后照常继续,而不管其他 case 标签如何。当您遇到第一个情况(“米”)时,您会从 JSON 中读取 int
。但随后执行继续,您读取另一个 int (来自“ivs”情况),然后您忽略一个值(在默认情况下),但此时没有可忽略的值,因此你的代码崩溃了。为了防止执行失败,您需要在每个 case 的末尾包含 break
语句。
您的代码应如下所示:
switch(name) {
case "meters":
jsonreader.nextInt();
break;
case "ivs":
jsonreader.nextInt();
break;
default:
jsonreader.skipValue();
break; // This one's technically optional because there's nothing to
// fall through to, but including it makes your code cleaner
// and more consistent
}
关于nextInt() 时 JSONParser 上的 Java Android 问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45592434/