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

改进2:如何正确检查响应的有效性。body()?

鲁建茗
2023-03-14

自版本2起。改装:2.3。0我在响应中收到NullPointerException警告。body()即使在检查body是否为null之前:

Method invocation 'getCar()' may produce 'java.lang.NullPointerException'

2.3.0的更改日志中,有一个与空检查相关的条目:

改型现在使用@Nullable注释所有可能的空值。[...] 默认情况下,我们使用@ParametersArennull,除非显式注释为@Nullable,否则所有参数和返回类型都不会为null。

这是你想要的行为吗?在我看来,回应。body()应该是不可变的,因此我的签入图片1不应该显示警告。

这不是一个关于NullPointerExceptions的问题,而是关于如何正确处理RetroFit2的响应。为了暂时没有警告,我必须做这样的事情:

if(response != null) {
    CarResponseBody body = response.body();
    if (body != null && body.getCar() != null){
        CarResponse car = body.getCar();
    }
}

很多代码只是为了检查是否有有效的响应。。。

共有3个答案

杨豪
2023-03-14

试试这个

 if (response != null) {CarResponseBody body= new CarResponseBody(); if (response.raw().code() == 200 && response.body()!=null) {
body = response.body();if(body.getCar()!=null){ CarResponse car =body.getCar()}}}
郎翔
2023-03-14

我通常在WhateverResponse类中创建isValid()或hasResults()方法

boolean isValid(){
return getCar() != null && getWheel() != null && somethingElse
}

用法

if(response.isValid()){
//do your other if's
}

没有必要检查空响应。errorBody()将不为null或为2。在此之前将调用Callback onFailure()方法

龙永逸
2023-03-14

这是你想要的行为吗?

如果您检查响应的JavaDoc

@nullable Public T body()成功响应的反序列化响应体

正如它所建议的,如果响应成功,body()不会为null。要检查是否成功,你有is成功()

如果code()在范围[200..300]内,则返回true。

因此,@Nullable是一个有效的选择,因为在任何非成功的情况下,响应都可以是null,例如没有网络、无效请求或其他错误。

IDE中的提示是一个lint警告,用于检查源代码中常见错误或bug的可能来源。

这就是为什么body()可能是null以及为什么lint首先将此报告为警告。

在我看来,答案是肯定的。body()应该是不可变的,因此我在图片1中的签入不应该显示警告。

理论上你是对的。你和我都知道,body()是不可变的,但这里的问题是这个lint检查无法知道。

T res1 = response.body(); // could be null
T res2 = response.body(); // ...maybe still null?

lint是一个静态源代码和字节码分析器,有助于防止常见的错误和错误,其中一个lint检查试图防止NPE。如果您注释了一个方法@Nullable,检查所知道的就是返回的值可能是null,并且如果您尝试直接对调用的结果进行操作,它将引发警告。

// does response return the same value twice? who knows?
response.body() != null && response.body().getCar() != null

处理响应的方式实际上是消除lint警告的唯一方法,而不是抑制或禁用它。

通过将它分配给一个局部变量,您可以确保一个值在某个时候不是null,并且将来不会变成null,lint也可以看到这一点。

CarResponseBody body = response.body(); // assign body() to a local variable
if (body != null && body.getCar() != null) { // variable is not null
    CarResponse car = body.getCar(); // safe to access body, car is also not null
    // everything is fine!
}

这是你想要的行为吗?

是的。@Nullable是提示方法可能返回null的好方法,如果您在某些路径上返回null,您也应该在自己的代码中使用它,因为lint可以警告可能的NullPointerExceptions。

如果某个方法可能返回null,则必须将其分配给本地字段,并检查该字段中的null值,否则可能会导致该值发生更改。

Car car = response.getBody(); // car could be null
if(car != null) {
  // car will never be null
}

我看到你似乎还额外地将你的响应对象包装在一个额外的层中。

CarResponseBody body = response.body();
Car car = body.getCar()

如果您想消除代码的复杂性,您应该在早期阶段了解如何删除此包装*ResponseBody。您可以通过注册自己的转换器并在那里添加额外的处理来实现。你可以在杰克·沃顿的改装演讲中看到更多关于这方面的内容

另一种完全不同的方法是使用RxJava进行改装,这样就不需要自己检查响应。您将获得一个成功或一个错误,这可以通过Rx方式处理。

 类似资料:
  • 服务器的响应如下所示: 如何从响应中检索? 实现@Piyush Patel后,回答:我将和分别更改为和。但是我的中的提示错误,要求我实现其和方法 新手问题:我是否使用方法?!!

  • 问题内容: 尝试使应用程序启动默认浏览器访问URL,但前提是输入的URL有效,否则将显示一条消息,指出URL无效。 我将如何使用Swift检查有效性? 问题答案: 如果您的目标是验证应用程序是否可以打开URL,则可以执行以下操作。尽管Safari浏览器可以打开URL,但该网站可能不存在或可能已关闭。 作为一个方面说明,这并 不能 检查URL是否是有效或完整。例如,通过“ https://”的调用将

  • 问题内容: 如何检查shell脚本中IP地址的有效性,该范围在to 的范围内? 问题答案: 如果您使用的是bash,则可以对模式进行简单的正则表达式匹配,而无需验证四边形: 如果您坚持使用POSIX Shell,则可以使用BRE而不是ERE来做基本相同的事情: 请注意,假设您的正则表达式锚定在字符串的左侧,因此不需要缩写。 如果确认每个四边形小于256很重要,那么显然您将需要更多代码: 甚至更少的

  • 问题内容: 我很好奇,用Java 创建对象的最明显的方法已被弃用,并且似乎已被使用宽大日历的不太明显的方法“替代”。 如何检查以日,月和年的组合形式给出的日期是否为有效日期? 例如,2008-02-31(如yyyy-mm-dd)将是无效日期。 问题答案: 当前的方法是使用日历类。它具有setLenient方法,该方法将验证日期和引发异常,如果超出示例,则抛出异常。 忘记添加:如果您获得日历实例并使

  • 问题内容: 在我的项目中,我需要检查日期字符串是否评估为正确的Date对象。我决定允许yyyy-MM- dd和Date格式[(年,月,日)和(年,月,日,时,分)。我如何检查它们是否有效?我的代码返回“ 1980-01-01”的null和一些奇怪的日期(例如3837.05.01),这些日期给出了用逗号分隔的字符串: 我记得我必须从年份中减去1900,但是我也看到月份不同,所以我想避免检查日期字符串

  • 问题内容: 我对angularjs很陌生。说我的应用程式有表格。使用检查器,我注意到,如果angularjs认为该表单无效,则会向该表单添加ng- invalid类。可爱。 因此,似乎为了检查表单是否有效,我需要使用Jquery选择器来污染我的代码吗?不使用表单控制器来指示表单有效性的angularjs方法是什么? 问题答案: 当您将标签放入ngApp时,AngularJS会自动添加表单控制器(实