当前位置: 首页 > 知识库问答 >
问题:

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

戎洛华
2023-03-14

我一直在收到com.google.格森。JsonSyntaxException无法调用Gson。fromJson(),因此添加了一个捕获(异常)逻辑,但错误永远不会被捕获,而只是被抛出!

这是我所拥有的:

    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\u对象,但在第1行第1列路径$处为字符串”

为什么错误没有被捕获?

这是Stack跟踪:

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个答案

翟曦之
2023-03-14

找到了答案。原来是@Slf4j的日志。error()调用将该异常显示为Google StackDriver中的一个错误,因此告诉我已经收到数百万个错误。

怀浩大
2023-03-14

何时(…)。然后返回(null)您使用一些模拟库(jMock、Mockry或simular)的点。您定义,如果调用fromJson(“test”,Fulfillment.class),则应返回null。由于您已经定义了结果,所以不会调用来自JSON的实际方法。如果希望抛出expection,请删除行

when(gson.fromJson("test", Fulfillment.class)).thenReturn(null);
越麒
2023-03-14

您需要像这样捕获JsonSynaxException

对于Kotlin

捕获(e:JsonSyntaException){

 //show toast/snackabar/log here

}

对于Java

捕获(JsonSyntaxException e){

 //show toast/snackabar/log here

}

早些时候,我也在学习java。lang.IllegalStateException但它不起作用。这里的根异常似乎是JsonSyntaxException,因此,我们需要捕获这个。这对我有用!

 类似资料:
  • 问题内容: 我试图让用户有机会在引入会产生错误但又无法正常工作的东西之后重复输入,因为一旦发现 错误, 就不会再次执行try东西,而是直接进入catch东西,生成一个永恒的东西。柱。这是我的代码: 问题答案: 输入非整数时,对的调用不会消耗非整数。您需要致电(或)使用它。就像是,

  • 问题内容: 我试图让用户有机会在引入会产生错误但又无法正常工作的东西之后重复输入,因为一旦发现 错误, 就不会再次执行try东西,而是直接进入catch东西,生成一个永恒的东西。柱。这是我的代码: 问题答案: 输入非整数时,对的调用不会消耗非整数。您需要致电(或)使用它。就像是,

  • 问题内容: 可以在Swift中捕获异常吗?给出以下代码: 是否可以防止异常导致整个程序崩溃?也就是说,Objective-C中的Swift等效于什么: 问题答案: 它没有异常处理,并且在开发人员论坛中的讨论讨论了为什么会这样: 但请记住,可可和可可触控传统上并不打算让您捕获异常。他们打算让您不要将它们放在首位。普通错误应使用可选类型和inout NSError参数处理;您应该通过编写更好的代码来解

  • 我调用了一个抛出异常的方法,但我不需要将此方法放在静态void main(String args[])中的try-catch块中,即使本教程说我应该得到一个错误。为什么会这样?下面是我的代码和教程的链接。我仔细研究了教程中的第二个示例。 https://beginnersbook.com/2013/04/java-throws/?unapproved=133049

  • 我正在尝试捕获caller方法中的IllegalAccessException。但它抓不到它。而是给出了一个错误。

  • 我在java selenium上编写了一个try/catch块,我不明白为什么它不能工作。它应该在网页上检查一个web元素,如果没有找到,它应该抛出一个NoSuchElementException并转到catch块。真正发生的情况是,没有找到元素,执行也没有继续catch块,它通过测试(Selenium WebTest)并完全停止执行,我的测试也失败了。我还在main方法中包含了“throws N