为什么 try/catch 异常不适用于 Gson.fromJson()?

Why isn't try/catch Exceptions working for Gson.fromJson()?

我通过调用 Gson.fromJson() 获得了 com.google.gson.JsonSyntaxException,因此添加了一个 catch(Exception) 逻辑,但错误从未被捕获,只是被抛出!

这是我的:

    Request request = new Request.Builder()
            .url(getOrderUrlWithId)
            .get()
            .build();
    try {
        Response response = this.okHttpClient.newCall(request).execute();

        GetOrderResult orderResult = gson.fromJson(gson.toJson(response.body().string()), GetOrderResult.class);
        response.close();
    } catch (IOException e) {
        log.error("Error retrieving order : " + e.getMessage(), e);
        throw new RuntimeException(e);
    } catch (Exception e) {
        log.error("Error happening for client PO: " + clientPO, e);
        return null;
    }

当我 运行 测试时,我得到“com.google.gson.JsonSyntaxException: java.lang.IllegalStateException: Expected BEGIN_OBJECT but was STRING at line 1 column 1 path $ “

为什么错误没有被捕获?

这是堆栈跟踪:

com.google.gson.JsonSyntaxException: java.lang.IllegalStateException: Expected BEGIN_OBJECT but was STRING at line 1 column 1 path $
at com.google.gson.internal.bind.ReflectiveTypeAdapterFactory$Adapter.read(ReflectiveTypeAdapterFactory.java:226)
at com.google.gson.Gson.fromJson(Gson.java:927)
at com.google.gson.Gson.fromJson(Gson.java:892)
at com.google.gson.Gson.fromJson(Gson.java:841)
at com.google.gson.Gson.fromJson(Gson.java:813)
at com.hub.fulfill.circlegraphics.getOrdersByCgOrderId(CircleGraphicsApi.java:164)

when(...).thenReturn(null) 指出您使用了一些模拟库(jMock、Mockery 或 simular)。并且您定义如果 fromJson("test", Fulfillment.class) 被调用 mock 应该 return null。由于您已经定义了结果,因此不会调用实际方法 fromJson。 如果您希望抛出期望,请删除行

when(gson.fromJson("test", Fulfillment.class)).thenReturn(null);

想通了。结果是 @Slf4j 的 log.error() 调用将异常显示为 Google StackDriver 中的错误,因此告诉我我遇到了数百万个错误。

你需要像这样捕获 JsonSyntaxException

对于 Kotlin

catch(e: JsonSyntaxException){

 //show toast/snackabar/log here

}

对于Java

catch(JsonSyntaxException e){

 //show toast/snackabar/log here

}

之前我也在抓java.lang.IllegalStateException,但是没用。 似乎这里的根异常是 JsonSyntaxException,因此,我们需要捕获这个异常。 它对我有用!