2016-03-27 3 views
3

Я очень новичок в разработке 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) 

Я запутался. Какой объект у меня отсутствует, здесь нет значения?

+1

Мне кажется, что 'holder.bindRestaurant (mRestaurants [position]);' В этом вызове 'position' индексирует нулевой объект. Я не эксперт, но сначала попробуйте сначала проверить этот массив на null. – markspace

+1

Не могли бы вы просто перестроить проект – Mehdi

+0

Возможно, вам нужно переместить свой код из 'bindRestaurant' в' onBindViewHolder' (даже если он ссылается, попробуйте переместить его). –

ответ

0

Параметр ресторана bindRestaurant имеет значение null. Похоже, что массив ресторана, переданный конструктору, имеет возможность обнулять элементы, если он даже инициализирован правильно.

Выделение массива только создает держатель для ссылки на объект, вы все равно должны на самом деле поместить что-то в каждое положение массива, так что либо массив имеет все нули, либо определенные позиции.

+0

Но сообщения журнала напечатаны правильно ... –

+0

Нет, это совершенно неправильно. Выход журнала доказывает, что этот элемент в массиве не равен NULL. Первый вызов 'restaurant.getName()' работает отлично, а второй вызов не работает. –

+0

трассировка стека показывает, что метод, в котором происходит NPE, является bindRestaurant и что метод failing - это Restaurant.getName(), поэтому, хотя я не могу определить, какой из двух, я ожидал бы, что оба будут терпеть неудачу. –