当 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 实例而不是预期的类型

当字符串不匹配时,我希望NULL返回而不是返回整数

Java中是使用增强for的null问题

为啥 java String类 中的valueOf(Object obj) 空时返回的是"null"而不是null

为 Laravel 关系返回 null 而不是“调用未定义的关系”错误