ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

android – 为什么Kotlin数据类在Gson的非可空字段中可以有空值?

2019-07-16 02:23:30  阅读:435  来源: 互联网

标签:android nullpointerexception gson kotlin


在Kotlin中,您可以创建一个数据类:

data class CountriesResponse(
    val count: Int,
    val countries: List<Country>,
    val error: String)

然后您可以使用它来解析JSON,例如“{n:10}”.在这种情况下,您将拥有一个对象val国家:CountriesResponse,从Retrofit,Fuel或Gson接收,包含以下值:count = 0,countries = null,error = null.

Kotlin + Gson – How to get an emptyList when null for data class中,您可以看到另一个示例.

当您稍后尝试使用国家/地区时,您将在此处获得一个例外:val size = countries.countries.size:“kotlin.TypeCastException:null无法转换为非null类型kotlin.Int”.如果你编写代码并使用?访问这些字段时,Android Studio会突出显示?并警告:对List< Country>类型的非null接收器进行不必要的安全调用.

那么,我们应该使用吗?在数据类?为什么应用程序在运行时期间可以将null设置为非可空变量?

解决方法:

发生这种情况是因为Gson使用不安全(如在java.misc.Unsafe中)实例构造机制来创建类的实例,绕过它们的构造函数,然后直接设置它们的字段.

有关研究,请参阅此Q& A:Gson Deserialization with Kotlin, Initializer block not called.

因此,Gson忽略了构造逻辑和类状态不变量,因此不建议将它用于可能受此影响的复杂类.它也忽略了setter中的值检查.

考虑一个Kotlin感知的序列化解决方案,例如Jackson(在上面链接的Q& A中提到)或kotlinx.serialization.

标签:android,nullpointerexception,gson,kotlin
来源: https://codeday.me/bug/20190716/1473849.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有