繁体   English   中英

非空对象类型上的 Retrofit-Kotlin NullPointerException

[英]Retrofit-Kotlin NullPointerException on non-null object type

在使用RetrofitKotlin实现 GitHub API 时,我遇到了一个非常奇怪的问题。

这是我第一次在 Andorid Arch 和Retrofit上工作,所以如果我在这个问题上犯了任何错误,请原谅我。

究竟发生了什么,我正在使用Retrofit调用 GitHub API 来获取用户的存储库。 一个 repo 在description null 当 API 返回 null 时,我的应用程序不会崩溃,当我将Intent中的对象传递给另一个Activity时它会崩溃。 我的数据类是Parcelable

下面是我的数据类:

data class GitHubRepository(
    var id: String = "",
    var name: String = "",
    var full_name: String = "",
    var owner: GitHubUser = GitHubUser(),
    var description: String = "",            // This is getting null even when it is of non-null type
    var html_url: String = "",
    var watchers_count: String = ""
) : Parcelable {
constructor(parcel: Parcel) : this(
        parcel.readString(),
        parcel.readString(),
        parcel.readString(),
        parcel.readParcelable(GitHubUser::class.java.classLoader),
        parcel.readString(),                // This is where i am getting error
        parcel.readString(),
        parcel.readString())

    override fun writeToParcel(parcel: Parcel, flags: Int) {
        parcel.writeString(id)
        parcel.writeString(name)
        parcel.writeString(full_name)
        parcel.writeParcelable(owner, flags)
        parcel.writeString(description)
        parcel.writeString(html_url)
        parcel.writeString(watchers_count)
    }

    override fun describeContents(): Int {
        return 0
    }

    companion object CREATOR : Parcelable.Creator<GitHubRepository> {
        override fun createFromParcel(parcel: Parcel): GitHubRepository {
            return GitHubRepository(parcel)
        }

        override fun newArray(size: Int): Array<GitHubRepository?> {
            return arrayOfNulls(size)
        }
    }
}

以下是我如何创建 Retrofit 对象:

val BASE_URL = "https://api.github.com/"

private var retrofit: Retrofit? = null

fun getClient(): Retrofit {

    if (retrofit == null) {
        retrofit = Retrofit.Builder()
                .baseUrl(BASE_URL)
                .addConverterFactory(GsonConverterFactory.create())
                .build()
    }

    return retrofit!!
}

以下是我的 API 请求:

@GET("users/{username}/repos")
fun getReposOfUser(
        @Path("username") username: String,
        @Query("page") pageNumber: Int,
        @Query("per_page") perPage: Int = 10
): Call<ArrayList<GitHubRepository>>

描述中null值的API: https : //api.github.com/users/kislyuk/repos

以下是回应:

[
...
{
    "id": 1924281,
    "name": "akutils",
    "full_name": "kislyuk/akutils",
    "owner": {...},
    "private": false,
    "html_url": "https://github.com/kislyuk/akutils",
    "description": null, // This is the null value
    ...
}
...
]

下面是 LogCat,其中GitHubModels.kt是我的Kotlin 文件,它也包含其他数据类。 有错误的是我上面显示的GitHubRepository数据类:

E/AndroidRuntime: FATAL EXCEPTION: main
    Process: com.tarunchauhan.githubapp, PID: 18276
    java.lang.RuntimeException: Unable to start activity ComponentInfo{com.tarunchauhan.githubapp/com.tarunchauhan.githubapp.activities.RepoDetailsActivity}: java.lang.IllegalStateException: parcel.readString() must not be null
        at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2817)
        at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2892)
        at android.app.ActivityThread.-wrap11(Unknown Source:0)
        at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1593)
        at android.os.Handler.dispatchMessage(Handler.java:105)
        at android.os.Looper.loop(Looper.java:164)
        at android.app.ActivityThread.main(ActivityThread.java:6541)
        at java.lang.reflect.Method.invoke(Native Method)
        at com.android.internal.os.Zygote$MethodAndArgsCaller.run(Zygote.java:240)
        at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:767)
     Caused by: java.lang.IllegalStateException: parcel.readString() must not be null
        at com.tarunchauhan.githubapp.models.GitHubRepository.<init>(GitHubModels.kt:29)
        at com.tarunchauhan.githubapp.models.GitHubRepository$CREATOR.createFromParcel(GitHubModels.kt:49)
        at com.tarunchauhan.githubapp.models.GitHubRepository$CREATOR.createFromParcel(GitHubModels.kt:47)
        at android.os.Parcel.readParcelable(Parcel.java:2781)
        at android.os.Parcel.readValue(Parcel.java:2675)
        at android.os.Parcel.readArrayMapInternal(Parcel.java:3042)
        at android.os.BaseBundle.unparcel(BaseBundle.java:257)
        at android.os.Bundle.getParcelable(Bundle.java:888)
        at android.content.Intent.getParcelableExtra(Intent.java:7075)
        at com.tarunchauhan.githubapp.activities.RepoDetailsActivity.onCreate(RepoDetailsActivity.kt:51)
        at android.app.Activity.performCreate(Activity.java:6975)
        at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1213)
        at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2770)
        at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2892) 
        at android.app.ActivityThread.-wrap11(Unknown Source:0) 
        at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1593) 
        at android.os.Handler.dispatchMessage(Handler.java:105) 
        at android.os.Looper.loop(Looper.java:164) 
        at android.app.ActivityThread.main(ActivityThread.java:6541) 
        at java.lang.reflect.Method.invoke(Native Method) 
        at com.android.internal.os.Zygote$MethodAndArgsCaller.run(Zygote.java:240) 
        at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:767) 

我什至在 API 请求中搜索将所有空值转换为字符串,但找不到任何可靠的想法。

请调查一下,让我知道任何解决方法。

谢谢:-)

您可能在这里将null写入您的parcelable: parcel.writeString(description)

您可能希望使用以下代码确保描述永远不会为nullparcel.writeString((if (description == null) "" else name))

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM