首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >只有安全或非空断言调用被允许在字符串类型的可空接收器上进行?

只有安全或非空断言调用被允许在字符串类型的可空接收器上进行?
EN

Stack Overflow用户
提问于 2020-05-31 05:50:41
回答 1查看 3.4K关注 0票数 1

我有api响应的数据类,如下所示

代码语言:javascript
复制
data class ApiResponse(
@SerializedName("ErrorCode") @Expose
var errorCode: Int = 0,
@SerializedName("Message")
@Expose
var message: String? = null,

@SerializedName("Token")
@Expose
var token: String? = null,

@SerializedName("UserId")
@Expose
var userId: String? = null,

@SerializedName("DOB")
@Expose
var birthdate: String? = null,

@SerializedName("Mobile")
@Expose
var mobile: String? = null,

@SerializedName("Data")
@Expose
var dataList: MutableList<Data?>? = null
)

我的api调用

代码语言:javascript
复制
val request = ApiServiceBuilder.buildService(NetworkCall::class.java)
    request.login(apiPost = ApiPost("long","hello")).enqueue(object :Callback<ApiResponse>{
        override fun onResponse(call: Call<ApiResponse>, response: Response<ApiResponse>) {
            Log.e("resopne",response.body().userId)
        }

        override fun onFailure(call: Call<ApiResponse>, t: Throwable) {
            t.printStackTrace()
            Log.e("resopne","error")
        }
    })

当我试着得到userId的时候

仅允许对可空的安全或非空断言调用。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2020-05-31 06:13:53

您已经将模型类中的userId定义为optional or nullable,方法是在类型的前面放置一个?

代码语言:javascript
复制
@SerializedName("UserId")
@Expose
var userId: String? = null

因此,当从response.body()读取值时,它告诉您,response.body()中的值userId可能为空,并将在运行时抛出null-pointer exception。因此,为了保护它,它给了你两个选择:

1) Only safe userId? -> --这意味着如果值为null,那么它将不会继续执行该特定行。

2) Non-null asserted userId!! ->意味着您要告诉编译器它永远不会是空的,并且您保证如果这个值得到空,那么它将抛出一个运行时null-pointer exception

因此,最佳实践是将?用于Only Safe,并以这种方式使用它,因为如果它始终是not-null,则不会产生任何影响。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/62112124

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档