有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

java无法确定NullPointerException中哪个变量为null

我对Android/Java开发非常陌生,尽管我是一名经验丰富的web开发人员。我读过thisthis,但仍然有问题

我有一个SQLite数据库,其中有一个名为Restaurants的表,用于存储餐厅。我正在尝试使用RecyclerView显示餐厅列表

我得到了一个空指针异常,似乎无法确定什么是空指针

这是我的RecyclerView课程:

package com.myapp.lunchboxchicago.adapters;

import 安卓.content.Context;
import 安卓.support.v7.widget.RecyclerView;
import 安卓.util.Log;
import 安卓.view.LayoutInflater;
import 安卓.view.View;
import 安卓.view.ViewGroup;
import 安卓.widget.TextView;

import com.myapp.lunchboxchicago.Message;
import com.myapp.lunchboxchicago.R;
import com.myapp.lunchboxchicago.restaurants.Restaurant;

/**
 * Created by estrom on 3/23/2016.
 */
public class RestaurantViewAdapter extends RecyclerView.Adapter<RestaurantViewAdapter.RestaurantViewHolder> {
    public static final String TAG = RestaurantViewAdapter.class.getSimpleName();
    private Restaurant[] mRestaurants;
    private Context mContext;

    public RestaurantViewAdapter(Context context, Restaurant[] restaurants) {
        mContext = context;
        mRestaurants = restaurants;
    }

    @Override
    public RestaurantViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
        View view = LayoutInflater.from(parent.getContext()).inflate(R.layout.restaurant_list_item, parent, false);
        RestaurantViewHolder viewHolder = new RestaurantViewHolder(view);

        return viewHolder;
    }

    @Override
    public void onBindViewHolder(RestaurantViewHolder holder, int position) {
        holder.bindRestaurant(mRestaurants[position]);
    }

    @Override
    public int getItemCount() {
        return mRestaurants.length;
    }

    public class RestaurantViewHolder extends RecyclerView.ViewHolder implements View.OnClickListener {
        public TextView mRestaurantName;

        public RestaurantViewHolder(View itemView) {
            super(itemView);
            mRestaurantName = (TextView) itemView.findViewById(R.id.restaurantNameLabel);
            itemView.setOnClickListener(this);
        }

        public void bindRestaurant(Restaurant restaurant) {
            Log.wtf(TAG, "Binding " + restaurant.getName());
            Log.wtf(TAG, "To TextView ID: " + mRestaurantName.getId());
            mRestaurantName.setText(restaurant.getName());
        }

        @Override
        public void onClick(View v) {
            Message.message(mContext, "We'd open " + mRestaurantName + " in the view screen");
        }
    }
}

{}中的两个{}语句返回以下内容:

03-26 19:17:34.033 30414-30414/com.myapp.lunchboxchicago E/RestaurantViewAdapter: Binding Shamrock Club
03-26 19:17:34.050 30414-30414/com.myapp.lunchboxchicago E/RestaurantViewAdapter: To TextView ID: 2131558502

因此,看起来两个必需的对象都存在并被实例化。但是在下一行(mRestaurantName.setText(restaurant.getName());)我仍然会遇到这个错误

03-26 19:17:34.057 30414-30414/com.myapp.lunchboxchicago D/AndroidRuntime: Shutting down VM
03-26 19:17:34.058 30414-30414/com.myapp.lunchboxchicago E/AndroidRuntime: FATAL EXCEPTION: main
                                                                                  Process: com.myapp.lunchboxchicago, PID: 30414
                                                                                  java.lang.NullPointerException: Attempt to invoke virtual method 'java.lang.String com.myapp.lunchboxchicago.restaurants.Restaurant.getName()' on a null object reference
                                                                                      at com.myapp.lunchboxchicago.adapters.RestaurantViewAdapter$RestaurantViewHolder.bindRestaurant(RestaurantViewAdapter.java:62)
                                                                                      at com.myapp.lunchboxchicago.adapters.RestaurantViewAdapter.onBindViewHolder(RestaurantViewAdapter.java:44)
                                                                                      at com.myapp.lunchboxchicago.adapters.RestaurantViewAdapter.onBindViewHolder(RestaurantViewAdapter.java:18)

我很困惑。我遗漏了什么对象,在这里是空的


共 (1) 个答案

  1. # 1 楼答案

    bindRestaurant的餐厅参数为null。如果传入构造函数的餐厅数组被正确初始化,那么它似乎有可能是可为空的元素

    分配数组只是为对象引用创建一个保持器,您仍然需要在数组的每个位置实际放置一些内容,因此数组要么全部为空,要么特定位置为空