Retrofit - 如何在改造中处理NumberFormatException错误?

时间:2018-04-13 06:00:48

标签: java android json retrofit retrofit2

我使用改造来实现这样的界面:

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

并定义QueryResult类:

class QueryResult {
    int count;
    ...
}

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

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

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

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

“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;
    }
}

但是有更好的方法来处理吗?将计数声明为String似乎不太直观。我想可以选择配置改造。

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

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

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

提前致谢。

4 个答案:

答案 0 :(得分:1)

在将 count 转换为空之前,请检查 public class QueryResult { String count; int getCount() { try { if (!TextUtils.isEmpty(count)) { return Integer.parseInt(count); } } catch (NumberFormatException e) { } return 0; } } 是否为空

或更好地更改后端的响应

试试这个

"scripts": {
  "cypress:open:dev": "CYPRESS_BASE_URL=http://localhost:3000 cypress open",
  "cypress:open:prod": "CYPRESS_BASE_URL=http://mycompanydomain.com cypress open",
  "cypress:run:dev": "CYPRESS_BASE_URL=http://localhost:3000 cypress run",
  "cypress:run:prod": "CYPRESS_BASE_URL=http://mycompanydomain.com cypress run",
}

答案 1 :(得分: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;
            }
        }
    }

答案 2 :(得分:0)

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

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
}

答案 3 :(得分:0)

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

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

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

class QueryResult {
Integer count;
...
}

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

Double var;