2017-02-07 7 views
-5
java.lang.NullPointerException: Attempt to invoke interface method 'int java.util.List.size()' on a null object reference

я получаю эту ошибку при выполнении этого кода:Как я могу получить ошибку NullException, если я проверяю, что два элемента не являются нулевыми?

if (listView != null && adapter != null) { 
    listView.setAdapter(adapter); 
} 

Вот полный трассировки стека:

java.lang.NullPointerException: Attempt to invoke interface method 'int java.util.List.size()' on a null object reference 

at android.widget.ArrayAdapter.getCount(ArrayAdapter.java:337)                        
at android.widget.ListView.setAdapter(ListView.java:491) 
at com.themorrisonagency.gcocommuter.RideFragmentPage.setUserVisibleHint(RideFragmentPage.java:94) 
at android.support.v4.app.FragmentStatePagerAdapter.setPrimaryItem(FragmentStatePagerAdapter.java:157) 
at android.support.v4.view.ViewPager.populate(ViewPager.java:1270) 
at android.support.v4.view.ViewPager.populate(ViewPager.java:1120) 
at android.support.v4.view.ViewPager$3.run(ViewPager.java:277) 
at android.view.Choreographer$CallbackRecord.run(Choreographer.java:858) 
at android.view.Choreographer.doCallbacks(Choreographer.java:670) 
at android.view.Choreographer.doFrame(Choreographer.java:603) 
at android.view.Choreographer$FrameDisplayEventReceiver.run(Choreographer.java:844) 
at android.os.Handler.handleCallback(Handler.java:746) 
at android.os.Handler.dispatchMessage(Handler.java:95) 
at android.os.Looper.loop(Looper.java:148) 
at android.app.ActivityThread.main(ActivityThread.java:5491) 
at java.lang.reflect.Method.invoke(Native Method) 
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:728) 
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:618) 

Вот где я инициализирует адаптер:

public RideMatchesAdapter(Context context, int resource, List<Ride> objects) 
{ 
    super(context, resource, objects); 
    if (objects != null) { 
     activityContext = context; 
     layoutResource = resource; 
     this.rideList = objects; 
     final int maxMemory = (int) (Runtime.getRuntime().maxMemory() /1024); 
     final int cacheSize = maxMemory/8; 
    } else { 
     Log.e(TAG, "objects cannot be null"); 
    } 
} 

Также попытался проверить, нет ли моего внутреннего списка. Все еще бросая исключение:

public int getCount(){ 
    if(this.rideList != null){ 
     return this.rideList.size(); 
    } else { 
     return 0; 
    } 
} 
+0

пустая ссылка исключение не происходит именно там, если вы не бежите старый код. У вас есть стек? Он говорит что-то о 'java.util.List.size()'. Является ли адаптер обычным? –

+0

Спасибо за быстрый ответ. Этот оператор if помещается в метод setUserVisibleHint. – dawoodman71

+1

Вы должны сделать нулевую проверку перед созданием объекта 'RideMatchesAdapter'. Создайте этот объект и установите этот адаптер в свой список только в том случае, если 'List ' не является нулевым. –

ответ

1

Я думаю исключение, исходящее от адаптера. Проверьте код адаптера для получения размера списка данных.

2

Посмотрев на одну строку трассировки стека, которую вы добавили, моя ставка заключается в том, что ваш NullPointerException происходит внутри вашего кода адаптера. Возможно, в этом методе:

@Override 
public int getItemCount() { 
    return itemsList.size();// Maybe your itemsList is null. 
} 

Если вы используете ArrayAdapter, то вы не инициализацию адаптера правильно. Вам необходимо передать не нулевой список на ваш ArrayAdapter

+0

У меня нет метода getItemCount(), но у меня есть метод getCount(), который возвращает мой внутренний размер списка. Я проверяю, имеет ли список значение null перед возвратом. – dawoodman71

+0

@ dawoodman71 Можете ли вы опубликовать код, в котором вы инициализируете свой объект 'adapter'? –

+0

'public RideMatchesAdapter (контекст контекста, int-ресурс, список объектов) { супер (контекст, ресурс, объекты); if (objects! = Null) { activityContext = context; layoutResource = ресурс; this.rideList = объекты; final int maxMemory = (int) (Runtime.getRuntime(). MaxMemory()/1024); final int cacheSize = maxMemory/8; } else { Log.e (TAG, «объекты не могут быть пустыми»); } } ' Это выглядит ужасно. , ,Я собираюсь опубликовать это в вопросе. – dawoodman71

0

Спасибо, что помогли пройти этот процесс. Хотя ни одно из предложений не решило мою проблему, я ценю вашу помощь!

Моя проблема была на самом деле вызвана адаптером! = Null, но по какой-то причине мне нужно было воссоздать адаптер. Я предположил, что это останется, поскольку Фрагмент не был уничтожен.

В моей setUserVisibleHint:

if (isVisibleToUser) { 
     ((RidesActivity) getContext()).setIndicator(POSITION); 
     if (fragmentLoaded) { 
      if (GACommuter.rideMatches == null) { 
       ((RidesActivity) getContext()).loadData(); 
      } else if(listView != null) { 
       adapter = new RideMatchesAdapter(this.getContext(), R.layout.ride_match, GACommuter.rideMatches); 
       adapter.notifyDataSetChanged(); 
       listView.setAdapter(adapter); 
      } 
     } 
    }