自版本2起。改装:2.3。0
我在响应中收到
即使在检查body是否为NullPointerException
警告。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();
}
}
很多代码只是为了检查是否有有效的响应。。。
试试这个
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()}}}
我通常在WhateverResponse类中创建isValid()或hasResults()方法
boolean isValid(){
return getCar() != null && getWheel() != null && somethingElse
}
用法
if(response.isValid()){
//do your other if's
}
没有必要检查空响应。errorBody()将不为null或为2。在此之前将调用Callback onFailure()方法
这是你想要的行为吗?
如果您检查响应的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会自动添加表单控制器(实