2014-11-04 56 views
0

我在下面的方法中獲得了NullPointerException,我嘗試了所有我能想到但沒有成功的事情。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,應用程序會在上面的showCustomListView()方法中使用NPE崩潰。我試圖清除列表,我試圖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 2014-11-04 17:59:16

+0

它的發佈,我懷疑它有一些與片段回調方法 – 2014-11-04 18:01:50

+0

哪一行是80行?它必須是這個對嗎?:列表 allTransactions = getTransactionList(); – Spidy 2014-11-04 18:03:04

回答

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

這對一個NullPointerException兩種可能性:

  1. tempTransactionnull

  2. getTransactionDate()返回null

由於您使用的getTransactionDate()在多個位置的返回值,你應該創建一個新的變量:

Calendar transactionDate = tempTransaction.getTransactionDate(); 

現在你可以檢查此transactionDatenull,你可以在你的if重用條件。您也將立即知道tempTransaction是否爲null,因爲在這種情況下,該行將拋出NullPointerException

+1

很棒的回答。最好的選擇是以調試模式運行應用程序並逐步完成代碼。這至少會告訴你是什麼原因造成的,那麼你可以弄清楚爲什麼Null出現在第一位。 – Spidy 2014-11-04 18:17:11

+0

好的,現在看看 – 2014-11-04 18:17:50

+0

明智的,它確實照顧了空例外,但它沒有返回列表中的最後一個項目,我將通過自己的工作,感謝您的答案 – 2014-11-04 18:27:40