为什么try / catch Exception对于Gson.fromJson()不起作用?

时间:2018-12-17 22:12:43

标签: java exception error-handling exception-handling gson

我通过调用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:预期为BEGIN_OBJECT,但位于第1行第1列路径$ STRING “

为什么没有发现错误?

这是堆栈跟踪:

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)

3 个答案:

答案 0 :(得分:1)

when(...)。thenReturn(null)表示您使用了某些模拟库(jMock,Mockery或类似库)。并且您定义了,如果fromJson(“ test”,Fulfillment.class)被调用模拟,则应返回null。由于已经定义了结果,因此不会调用fromJson的实际方法。 如果您希望引发期望,请删除行

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

答案 1 :(得分:1)

弄清楚了。因此,事实证明@ Slf4j的log.error()调用将异常显示为Google StackDriver中的错误,因此告诉我我已经收到了数百万个错误。

答案 2 :(得分:1)

您需要像这样捕获JsonSyntaxException

对于Kotlin

catch(e:JsonSyntaxException){

 //show toast/snackabar/log here

}

对于Java

catch(JsonSyntaxException e){

 //show toast/snackabar/log here

}

更早之前,我还捕获了java.lang.IllegalStateException,但没有成功。 似乎这里的根本异常是JsonSyntaxException,因此,我们需要捕获这一异常。 它对我有用!