【问题标题】:Retrofit - How to error handle the NumberFormatException in retrofit?改造 - 如何在改造中错误处理 NumberFormatException?
【发布时间】:2018-04-13 06:00:48
【问题描述】:

我使用改造来实现这样的接口:

Observable<QueryResult> queryData(@Body QueryParams params);

并定义 QueryResult 类:

class QueryResult {
    int count;
    ...
}

当我执行 queryData 语句时,它会产生以下错误:

com.google.gson.JsonSyntaxException: java.lang.NumberFormatException: Invalid double: ""

显然,这是由api返回数据引起的:

{"count":"",...}

“计数”旨在表示一个数字,但不知何故或有时,服务器开发人员希望使用“”来表示 0。

我的问题是我该如何处理这种情况?

我已尝试在 QueryResult 类中进行错误处理:

class QueryResult {
    String count; // change from int to String;
    ...
    int getCount() {
        // do the error handling
        int ret = 0;
        try {
            ret = Integer.parseInt(count);
        } catch (Exception e) {}
        return ret;
    }
}

但是有没有更好的方法来处理它?将计数声明为字符串似乎不太直观。我想可能有一个配置改造的选项。

更新 感谢您对提高效率和在 gson 转换器中注册 TypeAdapter 的建议的回答。 但我想知道的是,错误处理是否可以由改造库本身完成。观点是当我最初将count字段声明为int时,它可以同时处理来自服务器的整数和字符串类型的值,如:

{"count":123,...} or {"count":"123",...}

没有错误。所以我假设错误句柄可以与库本身中的整数配对行为一起完成。

提前致谢。

【问题讨论】:

  • 如果您的响应数据以字符串形式计数,那么当您获取数据时将其转换。
  • @RajeshKushvaha 当然,我会向后端团队寻求帮助。我只想做错误处理,这样我就不会在半夜醒来检查和验证后端团队的错误。还是谢谢。
  • @AndroidTeam 是的,这就是我在 QueryResult 中尝试过的。我在想,如果我仍然可以将 count 字段用作 int 并与改造库一起进行反序列化和错误处理。
  • @AmirMir 根据链接,通过注册 TypeAdapter 并在其中进行错误处理,这似乎是一个正确且可接受的解决方案。但是,我将不得不编写大量代码来进行错误处理。我就是想知道这种情况能不能在retrofit库中处理。

标签: java android json retrofit retrofit2


【解决方案1】:

首先,API 响应中这种不一致的行为是不可行的。 改造将无法处理这种情况。您必须手动处理此响应,正如您在问题中提到的那样。但是您可以像这样以有效的方式做到这一点

class QueryResult {

        Object count; // change to Object;

        int getCount() {
            // do the error handling
            if (count instanceof Integer) {
                return ((Integer) count);
            } else {
                return 0;
            }
        }
    }

【讨论】:

  • 我尝试了您建议的方式,发现count对象是String的一个实例,因此getCount()将始终返回0。似乎服务器始终将count作为字符串类型返回有没有价值。
【解决方案2】:

在转换成 count 之前尝试检查它是否为空

或者更好地改变来自后端的响应

试试这个

public class QueryResult {

    String count;

    int getCount() {

        try {
            if (!TextUtils.isEmpty(count)) {
                return Integer.parseInt(count);
            }

        } catch (NumberFormatException e) {
        }
        return 0;
    }
}

【讨论】:

  • 这样可以避免抛出空字符串条件。它对效率有很大帮助。谢谢。但我想知道的是:有没有办法通过改造库本身来处理错误?我将编辑我的端口以使其更具体。
【解决方案3】:

我能告诉你的最甜蜜的方法就是像你一样解析双倍。

Double ans=Double.ParseDouble(yourstringvalue);

这给出了双倍的 ans。 我在这里遇到的问题是您收到一个空字符串"" 把条件放在上面就行了

 Double ans=0.0
if(yourstringvalue!="" || yourstringvalue!=null){

  //  then parse here

 ans=Double.ParseDouble(yourstringvalue);


}

您将在ans 中获得所需的值

继续前进

if(ans!=0.0){
//do your task here
}

【讨论】:

  • 将字符串解析为Double和Integer有什么区别?
  • 如果将字符串解析为双精度,则以双精度形式给出值,如果以整数形式解析字符串,则以整数形式给出值。
【解决方案4】:

只需使用 Object 而不是原始数据类型。而不是 int 使用 Integer 对象。 Integer 类将原始类型 int 的值包装在对象中。对象类可用于 java 中的所有原始数据类型

如果未找到值且原始数据类型(int、double)无法处理 null 值并给出此错误,则改造返回 null。原始数据类型的对象类可以处理空值

在您的情况下,如果此计数变量导致异常,则此更改可能会解决您的问题

class QueryResult {
Integer count;
...
}

但你的例外说是双重的。我认为错误是因为某些变量是双数据类型并获得空值。只需将原始 double 更改为 Double 对象即可解决您的问题

Double var;

【讨论】:

    猜你喜欢
    • 2014-12-28
    • 2016-05-03
    • 2015-03-06
    • 1970-01-01
    • 2016-12-20
    • 2017-06-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多