当 GET 返回 null 而不是 List 时 KotlinxSerializer 出现 NullPointerException
Posted
技术标签:
【中文标题】当 GET 返回 null 而不是 List 时 KotlinxSerializer 出现 NullPointerException【英文标题】:NullPointerException at KotlinxSerializer when GET returns null instead of a List 【发布时间】:2021-12-10 20:09:42 【问题描述】:我使用 Ktor 获取这样的列表,在某些情况下返回 null。
override suspend fun getDevices(accessToken: String): List<Device>?
return client.get
url(path = "/devices")
header("Authorization", "Bearer $accessToken")
但是,当后端返回 null 时,我得到一个异常:
W/System.err: java.lang.NullPointerException
W/System.err: at io.ktor.client.features.json.serializer.KotlinxSerializer.read(KotlinxSerializer.kt:37)
这里最好的方法是什么?我认为最简单的方法是调整后端返回 [] 而不是 null,但是可以在客户端解决吗?或者是否有一个普遍的协议是后端应该返回 [] 而不是 null?
【问题讨论】:
when the backend returns null I get an Exception:
好吧,如果你使用返回的 null,你只会得到一个 NullPointerException。所以我会说在使用前检查null。请发布尝试使用该 null 的代码。
when the backend returns null
?那是什么样的后端? https服务器?如果您说服务器返回 [] 或 null,我想知道您的想法是什么。
【参考方案1】:
问题在于,由于read
方法签名,Ktor 中的任何 JsonSerializer
都只能将 JSON 文本反序列化为不可为空的对象:
fun read(type: TypeInfo, body: Input): Any
NullPointerException
被抛出,因为在该方法的末尾,!! 运算符用于将值转换为非空类型。
作为一种解决方法,您可以捕获 NullPointerException
并返回 null
值。此行为将在 Ktor 2.0.0 中修复。
【讨论】:
正在使用此解决方法,但想知道是否还有其他方法。无论如何,您的回答消除了我的疑虑,谢谢!以上是关于当 GET 返回 null 而不是 List 时 KotlinxSerializer 出现 NullPointerException的主要内容,如果未能解决你的问题,请参考以下文章
Hibernate query.list() 方法返回空列表而不是空值
Hibernate Query.list 返回实际的 Object 实例而不是预期的类型