2014-11-04 4 views
0

Я получаю NullPointerException следующим образом, и я пробовал все, что мог, без успеха.Необъяснимое исключение Null Pointer в Android

private void showCustomListView(int year, int month, int day) { 

     List<Transaction> mTransactionList = new ArrayList<Transaction>(); 
     mTransactionList = AppManager.getTransactionsByDay(year, month, day); 
     DailyTransactionAdapter mAdapter = new DailyTransactionAdapter(getActivity(), 0, mTransactionList); 
     dailyTransactionListView.setAdapter(mAdapter); 
     } 

Вот контекст: У меня есть активность: Activity_A хостинг Fragment_A. Описанный выше метод вызывается из onResume() обратного вызова Fragment_A и вот что о nResume() метода

@Override 
    public void onResume() { 
     super.onResume(); 
     //When the Fragment resumes set the shown date to today 
     mYear = selectedDate.get(Calendar.YEAR); 
     mMonth = selectedDate.get(Calendar.MONTH); 
     mDay = selectedDate.get(Calendar.DAY_OF_MONTH); 
     tvDisplayDate.setText(new StringBuilder() 
       .append(mMonth + 1).append("-").append(mDay).append("-") 
       .append(mYear).append(" ")); 

     showCustomListView(mYear, mMonth, mDay); 
     btnChangeDate.setOnClickListener(new View.OnClickListener() { 
      @Override 
      //After the view is created set the onclick lister for the 
      //Change date button 
      public void onClick(View view) { 
       showDatePicker(); 
      } 
     }); 

    } 

данные для этого адаптера исходит из списка в памяти, как это. Это раздел кода из AppManager

public static List<Transaction> getTransactionsByDay(int year, int month, int day){ 
     List<Transaction> dayTransactions = new ArrayList<Transaction>(); 
     List<Transaction> allTransactions = getTransactionList(); 
     Log.i(TAG, "Size: " + allTransactions.size()); 
     for (Transaction tempTransaction : allTransactions){ 
      if (tempTransaction.getTransactionDate().get(Calendar.YEAR) == year && 
        tempTransaction.getTransactionDate().get(Calendar.MONTH) == month && 
        tempTransaction.getTransactionDate().get(Calendar.DAY_OF_MONTH) == day) 
      { 
       dayTransactions.add(tempTransaction); 
      } 

     } 
     return dayTransactions; 
    } 

Это прекрасно работает, как и ожидалось, когда я запустить приложение как в запуске приложения из IDE (Android Studio) к устройству. Проблема возникает, когда я запускаю другой Activity-Activity_B после того, как приведенный выше список работает и видим, а в Activity_B я добавляю элемент в список в памяти, а размер списка идет, например, от 10 до 11.

Когда я теперь перейдите из Activity_B в Fragment_A, приложение вылетает с NPE по методу showCustomListView() выше. Я попытался очистить список, я пробовал adapter.notifydatasetchanged() все без успеха, он продолжает сбой при этом методе только после добавления в список во время работы приложения, он будет работать нормально после перезапуска приложения.

Что еще я должен попробовать: Вот некоторые из NPE

11-04 09:36:19.147 6464-6464/com.valuecardnfc.valuecardnfc E/AndroidRuntime﹕ FATAL EXCEPTION: main 
    Process: com.valuecardnfc.valuecardnfc, PID: 6464 
    java.lang.NullPointerException 
      at com.valuecardnfc.valuecardnfc.Models.AppManager.getTransactionsByDay(AppManager.java:80) 
      at com.valuecardnfc.valuecardnfc.Fragments.DailyTransactionFragment.showCustomListView(DailyTransactionFragment.java:160) 
      at com.valuecardnfc.valuecardnfc.Fragments.DailyTransactionFragment.onResume(DailyTransactionFragment.java:102) 
      at android.support.v4.app.Fragment.performResume(Fragment.java:1521) 
      at android.support.v4.app.FragmentManagerImpl.moveToState(FragmentManager.java:963) 
      at android.support.v4.app.FragmentManagerImpl.performPendingDeferredStart(FragmentManager.java:823) 
      at android.support.v4.app.FragmentManagerImpl.startPendingDeferredFragments(FragmentManager.java:1128) 
      at android.support.v4.app.FragmentManagerImpl.execPendingActions(FragmentManager.java:1477) 
      at android.support.v4.app.FragmentManagerImpl.executePendingTransactions(FragmentManager.java:472) 
      at android.support.v4.app.FragmentPagerAdapter.finishUpdate(FragmentPagerAdapter.java:141) 
      at android.support.v4.view.ViewPager.populate(ViewPager.java:1068) 
      at android.support.v4.view.ViewPager.populate(ViewPager.java:914) 
      at android.support.v4.view.ViewPager.onMeasure(ViewPager.java:1436) 
      at android.view.View.measure(View.java:16497) 
      at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:5125) 
      at android.widget.FrameLayout.onMeasure(FrameLayout.java:310) 
      at android.view.View.measure(View.java:16497) 
      at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:5125) 
      at com.android.internal.widget.ActionBarOverlayLayout.onMeasure(ActionBarOverlayLayout.java:327) 
      at android.view.View.measure(View.java:16497) 
      at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:5125) 
      at android.widget.FrameLayout.onMeasure(FrameLayout.java:310) 
      at com.android.internal.policy.impl.PhoneWindow$DecorView.onMeasure(PhoneWindow.java:2291) 
+4

Можете вы добавить код для AppManager.getTransactionsByDay? В частности, строка 80 в этом коде - это то место, куда бросается NPE. Моя первая мысль - механизм очистки Android уничтожает и воссоздает активность или фрагмент, и данные не сохраняются – Spidy

+0

Его опубликовали, я подозреваю, что он имеет что-то с методами обратного вызова Fragment –

+0

Какая строка линии 80? Это должно быть правильно: Список allTransactions = getTransactionList(); – Spidy

ответ

2
tempTransaction.getTransactionDate().get(Calendar.YEAR) 

Это имеет две возможности для NullPointerException:

  1. tempTransaction является null.

  2. getTransactionDate()null.

Поскольку вы используете возвращаемое значение getTransactionDate() в нескольких местах, вы должны создать новую переменную:

Calendar transactionDate = tempTransaction.getTransactionDate(); 

Теперь вы можете проверить, если это transactionDate является null, и вы можете использовать его в вашем if состояние. Вы также сразу же узнаете, tempTransaction - null, потому что в этом случае эта линия выкинет NullPointerException.

+1

Отличный ответ. Лучше всего запустить приложение в режиме отладки и выполнить код. Это, по крайней мере, скажет вам, что вызывает, тогда вы можете понять, почему Null присутствует в первую очередь. – Spidy

+0

Хорошо, теперь проверяем –

+0

Блестящий, он определенно позаботился о нулевом исключении, но не возвратил последний элемент, добавленный в список, я проработаю это самостоятельно, спасибо за ответ –

Смежные вопросы