尝试在 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");
}