Поменялась структура ответа。 W/System.err:java.lang.NullPointerException
Posted
技术标签:
【中文标题】Поменялась структура ответа。 W/System.err:java.lang.NullPointerException【英文标题】:Поменялась структура ответа. W/System.err: java.lang.NullPointerException 【发布时间】:2021-08-04 13:11:48 【问题描述】:应用程序正在运行,但响应结构和授权期间发生了一些变化(登录 + 通用令牌) 未包含在应用程序中
代码:
suspend fun authorize(phone: String, password: String) : AccessTokenResponse?
//safeApiCall is defined in BaseRepository.kt (https://gist.github.com/navi25/67176730f5595b3f1fb5095062a92f15)
val response = safeApiCall(
call = api.authorize(AuthorizeRequest(phone = phone, password = password)).await(),
errorMessage = "Error Fetching Popular Movies"
)
return accessToken(response?.data?.items?.getOrNull(0)?.authorizationCode!!)
suspend fun accessToken(authorizationCode: String) : AccessTokenResponse?
//safeApiCall is defined in BaseRepository.kt (https://gist.github.com/navi25/67176730f5595b3f1fb5095062a92f15)
val response = safeApiCall(
call = api.accessToken(AccessTokenRequest(authorizationCode = authorizationCode)).await(),
errorMessage = "Error Fetching Popular Movies"
)
return response?.data?.items?.getOrNull(0)
即,它在该行给出错误:
return accessToken(response?.data?.items?.getOrNull(0)?.authorizationCode!!)
结构 AccessTokenResponse:
data class AccessTokenResponse(
@SerializedName("access_token")
val accessToken: String,
@SerializedName("expires_at")
val expiresAt: Long,
@SerializedName("refresh_token")
val refreshToken: String,
@SerializedName("refresh_expires_at")
val refreshExpiresAt: Long
)
结构 AuthorizeResponse:
data class AuthorizeResponse(
@SerializedName("authorization_code")
val authorizationCode: String,
@SerializedName("expires_at")
val expiresAt: Long
)
控制台:
W/System.err: java.lang.NullPointerException
at com.example.ferry.data.api.FerryRepository.authorize(FerryRepository.kt:29)
at com.example.ferry.data.api.FerryRepository$authorize$1.invokeSuspend(Unknown Source:12)
at kotlin.coroutines.jvm.internal.BaseContinuationImpl.resumeWith(ContinuationImpl.kt:33)
at kotlinx.coroutines.DispatchedTask.run(DispatchedTask.kt:56)
at android.os.Handler.handleCallback(Handler.java:938)
at android.os.Handler.dispatchMessage(Handler.java:99)
at android.os.Looper.loop(Looper.java:246)
at android.app.ActivityThread.main(ActivityThread.java:8512)
at java.lang.reflect.Method.invoke(Native Method)
at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:602)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1130)
json:
"result": true,
"errors": null,
"items": [
"user": [
...
],
"authorization_code": "1234352353245dsfasfasfdasf",
"expires_at": 1620982345
],
"versions":
...
非常感谢您的帮助
【问题讨论】:
你能告诉我们哪个对象是空的吗? 使用!!
是不安全的,如果某些东西为空,你会得到一个异常,所以你应该处理它
在错误为null但预期为notnull的行中
@a_local_nobody 你能告诉我怎么做最好吗?
错误行在哪里?
【参考方案1】:
你必须在那里处理空异常。例如,您可以处理这样的事情。我没有尝试过这段代码。我希望你明白这一点。
从那里,当你想使用这个suspend fun
时,你需要再次检查这个fun
是否为空。
if (response != null)
return accessToken(response?.data?.items?.getOrNull(0)?.authorizationCode!!)
return null
【讨论】:
以上是关于Поменялась структура ответа。 W/System.err:java.lang.NullPointerException的主要内容,如果未能解决你的问题,请参考以下文章
css Когдатекстразбиваетсянаколонки,тобраузерпытаетсяравномернораспределитьсодержимоеблокапоуказанном
php Определяемпутьвкореньсайта
php ОставляетуказанныегруппыполейACFнастраницеуказанныхтерминоввадминке,анаостальныхудаляет。
swift Затемяпопыталсявсе-такитупо,кодомвстиле“Пирамидапогибели”,получитьданныекартинкидля3-хподрядэл