尝试在 Java 中捕捉 | Json 仍然崩溃
Try Catch in Java | Json still crashes
try {
Log.e("getTrackerSettings | ", json);
trackerSettings = new Gson().fromJson(json, typeToken);
} catch ( IllegalStateException e) {
Log.e("getTrackerSettings inside catch | ", "");
e.printStackTrace();
trackerSettings = new TrackerSettings(1, "Hello", "73");
}
此代码片段将崩溃,并给出以下内容:
E/getTrackerSettings inside try |: false
E/AndroidRuntime: FATAL EXCEPTION: main
Process: com.sendiman.manager, PID: 13196
com.google.gson.JsonSyntaxException: java.lang.IllegalStateException: Expected BEGIN_OBJECT but was BOOLEAN at line 1 column 6 path $
at com.google.gson.internal.bind.ReflectiveTypeAdapterFactory$Adapter.read(ReflectiveTypeAdapterFactory.java:226)
at com.google.gson.Gson.fromJson(Gson.java:932)
at com.google.gson.Gson.fromJson(Gson.java:897)
at com.google.gson.Gson.fromJson(Gson.java:846)
如您所见,这没有任何意义。整个函数也在一个更大的 try catch(Exception e) 中。
fromJson
方法抛出 com.google.json.JsonSyntaxException
。它不会抛出 java.lang.IllegalStateException
。你抓错东西了。
文本突出显示了 为什么 JSON 是错误的,并且在解析它时出现了 IllegalStateException。这是因果关系。不要将异常视为 'this specific thing went wrong',而应将其视为备用 return 值。 fromJson
调用 returns 或者 一个 T 对象(你要解析的东西), 或 一个JsonSyntaxException,并且 JsonSyntaxException 对象(异常只是对象)包含详细信息。您可以通过将它分配给一个变量来查询它,它的 toString 也只打印详细信息。 'some inner parsing code threw an IllegalStateException' 是这里的细节。
您似乎在尝试将字符串 "true"
或 "false"
解析为 json。它是无效的 JSON,因为所有 JSON 都必须是其最外层的 JSON 对象。
将 catch (IllegalStateException)
替换为 catch (JsonSyntaxException)
。
luk2302 在评论中回答。
Catch (JsonSyntaxException e) 确实捕获了崩溃。
它仍然失败,因为你试图捕捉 IllegalStateException
而不是 JsonSyntaxException
来自 javadoc 文档 fromJson
的签名是:
public <T> T fromJson(String json, Class<T> classOfT) throws JsonSyntaxException
try {
Log.e("getTrackerSettings | ", json);
trackerSettings = new Gson().fromJson(json, typeToken);
} catch (JsonSyntaxException e) {
Log.e("getTrackerSettings inside catch | ", "");
e.printStackTrace();
trackerSettings = new TrackerSettings(1, "Hello", "73");
}
try {
Log.e("getTrackerSettings | ", json);
trackerSettings = new Gson().fromJson(json, typeToken);
} catch ( IllegalStateException e) {
Log.e("getTrackerSettings inside catch | ", "");
e.printStackTrace();
trackerSettings = new TrackerSettings(1, "Hello", "73");
}
此代码片段将崩溃,并给出以下内容:
E/getTrackerSettings inside try |: false
E/AndroidRuntime: FATAL EXCEPTION: main
Process: com.sendiman.manager, PID: 13196
com.google.gson.JsonSyntaxException: java.lang.IllegalStateException: Expected BEGIN_OBJECT but was BOOLEAN at line 1 column 6 path $
at com.google.gson.internal.bind.ReflectiveTypeAdapterFactory$Adapter.read(ReflectiveTypeAdapterFactory.java:226)
at com.google.gson.Gson.fromJson(Gson.java:932)
at com.google.gson.Gson.fromJson(Gson.java:897)
at com.google.gson.Gson.fromJson(Gson.java:846)
如您所见,这没有任何意义。整个函数也在一个更大的 try catch(Exception e) 中。
fromJson
方法抛出 com.google.json.JsonSyntaxException
。它不会抛出 java.lang.IllegalStateException
。你抓错东西了。
文本突出显示了 为什么 JSON 是错误的,并且在解析它时出现了 IllegalStateException。这是因果关系。不要将异常视为 'this specific thing went wrong',而应将其视为备用 return 值。 fromJson
调用 returns 或者 一个 T 对象(你要解析的东西), 或 一个JsonSyntaxException,并且 JsonSyntaxException 对象(异常只是对象)包含详细信息。您可以通过将它分配给一个变量来查询它,它的 toString 也只打印详细信息。 'some inner parsing code threw an IllegalStateException' 是这里的细节。
您似乎在尝试将字符串 "true"
或 "false"
解析为 json。它是无效的 JSON,因为所有 JSON 都必须是其最外层的 JSON 对象。
将 catch (IllegalStateException)
替换为 catch (JsonSyntaxException)
。
luk2302 在评论中回答。
Catch (JsonSyntaxException e) 确实捕获了崩溃。
它仍然失败,因为你试图捕捉 IllegalStateException
而不是 JsonSyntaxException
来自 javadoc 文档 fromJson
的签名是:
public <T> T fromJson(String json, Class<T> classOfT) throws JsonSyntaxException
try {
Log.e("getTrackerSettings | ", json);
trackerSettings = new Gson().fromJson(json, typeToken);
} catch (JsonSyntaxException e) {
Log.e("getTrackerSettings inside catch | ", "");
e.printStackTrace();
trackerSettings = new TrackerSettings(1, "Hello", "73");
}