Я очень новичок в разработке Android/Java, хотя я опытный веб-разработчик. Я читал this и this, и у меня все еще возникают проблемы.Не могу понять, какая переменная равна null в NullPointerException
У меня есть база данных SQLite с таблицей «Рестораны», в которой хранятся, ну, рестораны. Я пытаюсь использовать RecyclerView для отображения списка ресторанов.
Я получаю исключение нулевого указателя и не могу понять, что такое null.
Вот мой RecyclerView
класс:
package com.myapp.lunchboxchicago.adapters;
import android.content.Context;
import android.support.v7.widget.RecyclerView;
import android.util.Log;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.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");
}
}
}
Два Log
заявления в bindRestaurant
возвращения следующие:
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)
Я запутался. Какой объект у меня отсутствует, здесь нет значения?
Мне кажется, что 'holder.bindRestaurant (mRestaurants [position]);' В этом вызове 'position' индексирует нулевой объект. Я не эксперт, но сначала попробуйте сначала проверить этот массив на null. – markspace
Не могли бы вы просто перестроить проект – Mehdi
Возможно, вам нужно переместить свой код из 'bindRestaurant' в' onBindViewHolder' (даже если он ссылается, попробуйте переместить его). –