Поменялась структура ответа。 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的主要内容,如果未能解决你的问题,请参考以下文章

Erlangе демо

css Когдатекстразбиваетсянаколонки,тобраузерпытаетсяравномернораспределитьсодержимоеблокапоуказанном

php Определяемпутьвкореньсайта

La Sylphide 仙女

php ОставляетуказанныегруппыполейACFнастраницеуказанныхтерминоввадминке,анаостальныхудаляет。

swift Затемяпопыталсявсе-такитупо,кодомвстиле“Пирамидапогибели”,получитьданныекартинкидля3-хподрядэл