当前位置: 首页 > 知识库问答 >
问题:

NullPointerException:尝试调用接口方法“BooleanJava”。util。收集空对象引用上的isEmpty()

艾飞宇
2023-03-14

我正在尝试从API获取一些数据,由于我将此回调指向空响应,因此出现以下错误:

E/AndroidRuntime: FATAL EXCEPTION: main
    Process: com.example.newsapp.develop, PID: 19479
    java.lang.NullPointerException: Attempt to invoke interface method 'boolean java.util.Collection.isEmpty()' on a null object reference
        at com.example.newsapp.API.NewsRemoteDataSource$getNewsList$1.onResponse(NewsRemoteDataSource.kt:21)
        at retrofit2.DefaultCallAdapterFactory$ExecutorCallbackCall$1.lambda$onResponse$0$DefaultCallAdapterFactory$ExecutorCallbackCall$1(DefaultCallAdapterFactory.java:89)
        at retrofit2.-$$Lambda$DefaultCallAdapterFactory$ExecutorCallbackCall$1$hVGjmafRi6VitDIrPNdoFizVAdk.run(Unknown Source:6)
        at android.os.Handler.handleCallback(Handler.java:873)
        at android.os.Handler.dispatchMessage(Handler.java:99)
        at android.os.Looper.loop(Looper.java:214)
        at android.app.ActivityThread.main(ActivityThread.java:7094)
        at java.lang.reflect.Method.invoke(Native Method)
        at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:494)
        at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:975)

如何在保持功能的同时修复它?这意味着,保持回调,并获得On成功的结果。

这是带有回调的适配器:

package com.example.newsapp.Adapters

import android.view.LayoutInflater
import android.view.View
import android.view.ViewGroup
import android.widget.ImageView
import android.widget.TextView
import androidx.recyclerview.widget.RecyclerView
import com.example.newsapp.ArticlesData
import com.example.newsapp.R
import com.example.newsapp.databinding.NewsItemBinding
import com.squareup.picasso.Picasso

class RecyclerAdapter (private var Articles: List<ArticlesData>) : RecyclerView.Adapter<RecyclerAdapter.ViewHolder>(){

    inner class ViewHolder(
        view: View
    ): RecyclerView.ViewHolder(view){
        private val binding = NewsItemBinding.bind(view)

        val itemTitle: TextView = binding.tvTitle
        val itemImage: ImageView = binding.ivNewsImage

        fun bind(articles: ArticlesData){
            Picasso.get().load(articles.urlToImage).into(binding.ivNewsImage)
            itemTitle.text = articles.Title
        }
    }

    interface Callback {
        fun onArticleClicked(articleClicked: ArticlesData)
    }

    var callback: Callback? = null

    override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): ViewHolder {
        val v = LayoutInflater.from(parent.context).inflate(R.layout.news_item, parent, false)
        return ViewHolder(v)
    }

    override fun onBindViewHolder(holder: ViewHolder, position: Int) {
        holder.bind(Articles[position])

        holder.itemImage.setOnClickListener {
            callback?.onArticleClicked(Articles[position])
        }

    }

    override fun getItemCount(): Int {
        return Articles.size
    }

    fun setNewsList(newList: List<ArticlesData>) {
        this.Articles = newList
        notifyDataSetChanged()
    }


}

这是问题产生的远程数据源:

package com.example.newsapp.API

import com.example.newsapp.ArticlesData
import com.example.newsapp.NewsListResponse
import retrofit2.Call
import retrofit2.Callback
import retrofit2.Response

class NewsRemoteDataSource {
    fun getNewsList(networkResponse: NetworkResponse<List<ArticlesData>>) {
        val service = RetrofitServices.instance
            .create(APIService::class.java)
            .getNewsList()

        service.enqueue(object : Callback<NewsListResponse> {
            override fun onResponse(
                call: Call<NewsListResponse>,
                response: Response<NewsListResponse>
            ) {
                val resource = response.body()?.run {
                    if (results.isNotEmpty())
                        Resource(NetworkStatus.SUCCESS, results)
                    else
                        Resource(NetworkStatus.ERROR)
                } ?: run {
                    Resource(NetworkStatus.ERROR)
                }
                networkResponse.onResponse(resource)
            }

            override fun onFailure(call: Call<NewsListResponse>, t: Throwable) {
                networkResponse.onResponse(Resource(NetworkStatus.ERROR, message = t.message))
            }
        })
    }


}

interface NetworkResponse<T> {
    fun onResponse(value: Resource<T>)
}

API响应:

data class NewsResponse (
    @SerializedName("status") var Status: String,
    @SerializedName("totalResults") var totalResults: Int,
    @SerializedName("articles") var Articles: List<ArticlesData>
    )

@Parcelize
data class ArticlesData (
    @SerializedName("source") var Source: @RawValue SourceData,
    @SerializedName("author") var Author: String? = " ",
    @SerializedName("title") var Title: String,
    @SerializedName("description") var Description: String,
    @SerializedName("url") var Url: String,
    @SerializedName("urlToImage") var urlToImage: String? =" ",
    @SerializedName("publishedAt") var publishedAt: String,
    @SerializedName("content") var Content: String? = " "
) : Parcelable

data class SourceData (
    @SerializedName("name") var Name: String,
)

data class NewsListResponse(
    val results: List<ArticlesData>
)

共有2个答案

沈枫涟
2023-03-14

由于某种原因,结果似乎为,您需要将if条件修改为

if (results.isNullOrEmpty())
    Resource(NetworkStatus.ERROR)
else
    Resource(NetworkStatus.SUCCESS, results)
洪和风
2023-03-14

这会导致异常,因为结果可能为空

 类似资料:
  • 我正在开发一个具有蓝牙功能的应用程序。我使用一个片段来扫描并列出蓝牙设备。单击时,会回调到提供所选蓝牙设备的主要活动。 我一开始使用的是Android 6(API 23)的智能手机,然后不得不调整代码以适应Android 5.0(API 21)的使用。 我只是将minSDK更改为API21并重新构建了项目,没有任何问题。 该应用程序在智能手机上运行时没有任何问题。安装了Android5的平板电脑运

  • 我是Android的新手,我正在开发一个应用程序,该应用程序试图连接服务器并获取Json响应,将其解析为类并使其可用。 为此,我上了三门课 公共类顾客{} 公共类ServerConnect{} 公共类JsonParser{} Serverconnect使用Volley库在异步线程上下载网页源代码。下载后,Server Connect类启动OnServerResponsed(String Respo

  • 问题内容: 我收到以下错误 尝试在空对象引用上调用虚拟方法’void android.widget.StackView.setAdapter(android.widget.Adapter)’ 在这条线上 完整的片段 EventsFragment.java 是 Stack_Adapter.java Stack_Items 问题答案: 您正在执行: 你是。返回。 你为什么用? 在哪里?您应该从正确的x

  • 我在使用 firebase firestore 时收到一个空指针引用,我的应用崩溃了。这是我的代码: 这里的sem指的是我的文档17030121084中的字段。 有人能对此提出解决方案吗?

  • 我的应用程序有问题,想解决它,但我无法访问解决方案,请帮帮我,,

  • 我的应用程序有问题,我想解决它,但我无法访问解决方案,请帮助我,,,