【问题标题】:Why isn't try/catch Exceptions working for Gson.fromJson()?为什么 Gson.fromJson() 的 try/catch Exceptions 不起作用?
【发布时间】:2019-05-18 07:44:27
【问题描述】:

我通过调用 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)

【问题讨论】:

  • 这是因为“test”不是字符串格式的有效json。它应该像 "{ "name" : "abc"}"。请提供相同的内容并进行测试。
  • @RajkumarNatarajan ^ 这如何解释未捕获并抛出异常的异常?
  • 从上面的代码 sn-p 有两次gson.fromJson("test", Fulfillment.class) 和 IllegalStateException 是由于第一次。所以 try 中的下一个不会被调用。
  • 请附上你得到的异常堆栈跟踪——这将使我们能够看到它被抛出的位置(可能在第 2 行,正如@RajkumarNatarajan 建议的那样)
  • 您确定您运行的是最新版本的代码吗?在调试器中尝试,或者在抛出异常的行之前添加一条日志语句。

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


【解决方案1】:

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

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

【讨论】:

  • 我实际上无法在测试中重现错误,因此将问题编辑为我的失败代码,而不是单元测试。错误仍在发生。
【解决方案2】:

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

【讨论】:

    【解决方案3】:

    你需要像这样捕获 JsonSyntaxException

    对于 Kotlin

    catch(e: JsonSyntaxException){

     //show toast/snackabar/log here
    

    }

    对于 Java

    catch(JsonSyntaxException e){

     //show toast/snackabar/log here
    

    }

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2015-07-11
      • 1970-01-01
      • 2017-06-12
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多