代码之家  ›  专栏  ›  技术社区  ›  Tarun Chauhan

在非null对象类型上改装Kotlin NullPointerException

  •  1
  • Tarun Chauhan  · 技术社区  · 8 年前

    在实现GitHub API的 Retrofit Kotlin .

    这是我第一次在安道尔拱门工作 改装 所以,如果我在这个问题上犯了什么错误,请原谅我。

    确切的情况是,我正在使用 改装 获取用户的存储库。一次回购 null 在里面 description . 当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)
            }
        }
    }
    

    下面是我如何创建改装对象:

    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>>
    

    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请求中搜索了将所有空值转换为字符串的方法,但并没有任何确切的想法。

    请对此进行调查,并让我知道这方面的任何解决方法。

    谢谢:-)

    1 回复  |  直到 5 年前
        1
  •  4
  •   daniribalbert    8 年前

    你可能在写 null 至您的包裹: parcel.writeString(description)

    您可能希望确保描述从不 无效的 与以下代码一起使用: parcel.writeString((if (description == null) "" else name))