2015-07-10 49 views
0

我從我的生產應用程序崩潰報告有時,下面我想該行是問題的根源:試圖調用虛擬方法的空對象引用 - Android電子

試圖調用虛擬方法的java.util.ArrayList foto.studio.SQLiteDataSource.getAllImageItems()」上在 foto.studio.MainActivity.onCreateOptionsMenu(MainActivity.java:267)一個空對象 參考

它指向該方法在MainActivity內部(和負責的行h ighlighted與 「==>」):

@Override 
    public boolean onCreateOptionsMenu(Menu menu) { 
     getMenuInflater().inflate(R.menu.main, menu); 

     final Menu m = menu; 
     final MenuItem item = menu.findItem(R.id.action_notifications); 
     View actionView = item.getActionView(); 
     notifTextView = (TextView) actionView.findViewById(R.id.notifTextView); 

     ArrayList <ImageItemsSetter> pendingOrdersList = new ArrayList<ImageItemsSetter>(); 

     ===> pendingOrdersList = datasource.getAllImageItems(); <=== 

     Log.i("value", "String calue of pendingorderlist: " + String.valueOf(pendingOrdersList.size())); 
     String unreadNotifs = String.valueOf(pendingOrdersList.size()); 

     if (!unreadNotifs.equals("0")) { 
      notifTextView.setText(unreadNotifs); 
     } else { 
      notifTextView.setVisibility(View.GONE); 
     }  

     item.getActionView().setOnClickListener(new OnClickListener() { 
      @Override 
      public void onClick(View v) { 
       m.performIdentifierAction(item.getItemId(), 0); 
      } 
     }); 


     return true; 
    } 

而且從SQLiteDataSource方法:

public ArrayList<ImageItemsSetter> getAllImageItems() { 
     Cursor cursor = database.query(SQLiteHelper.TABLE_IMAGES, 
       allColumnsImages, null, null, "product", null, null); 

     //Log.i("LOGTAG", "Returned " + cursor.getCount() + " rows"); 
     ArrayList<ImageItemsSetter> products = cursorToListImages(cursor); 
     return products; 
    } 

出了什麼問題?我的ArrayList(pendingOrdersList)是在我使用它之前啓動的,它爲什麼說它是空的?

行,我初始化數據庫:

@Override 
    protected void onResume() { 
     super.onResume(); 
     initImageLoader(); 

     datasource = new SQLiteDataSource(this); 
     datasource.open(); 
     invalidateOptionsMenu(); 

     // facebook analytics 
     AppEventsLogger.activateApp(this); 

     //get or update appVersion string 
     getAppVersion(); 

    } 

報告全文:

了java.lang.RuntimeException:無法啓動活動 ComponentInfo {} foto.studio/foto.studio.MainActivity : java.lang.NullPointerException:試圖調用虛擬方法 'java.util.ArrayList foto.studio.SQLiteDataSource.getAllImageItems()' 對空對象引用 android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2693) 在 android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2758) 在android.app.ActivityThread.access $ 900(ActivityThread.java:177)在 android.app.ActivityThread $ H.handleMessage(ActivityThread.java:1448) at android.os.Handler.dispatchMessage(Handler.java:102)at android.os.Looper.loop(Looper.java:145)at android.app.ActivityThread.main(ActivityThread.java:5942)at java.lang.reflect.Method.invoke(Native Method)at java.lang.reflect.Method.invoke(Method.java:372)at com .android.internal.os.ZygoteInit $ MethodAndArgsCaller.run(ZygoteInit.java:1400) at com.andro id.internal.os.ZygoteInit.main(ZygoteInit.java:1195) 引起:java.lang.NullPointerException:試圖調用虛擬方法'java.util.ArrayList foto.studio.SQLiteDataSource.getAllImageItems()'on在 com.android.internal.policy.impl.PhoneWindow處 android.app.Activity.onCreatePanelMenu(Activity.java:2947) foto.studio.MainActivity.onCreateOptionsMenu(MainActivity.java:267)一個空對象 參考.preparePanel(PhoneWindow.java:606) 在 com.android.internal.policy.impl.PhoneWindow.doInvalidatePanelMenu(PhoneWindow.java:980) 在 com.android.internal.policy.impl.PhoneWindow $ 1.run( PhoneWindow.java:308) at com.android.internal.policy.impl.PhoneWindow.doPendingInvalidatePanelMenu(PhoneWindow.java:954) 在 com.android.internal.policy.impl.PhoneWindow.restoreHierarchyState(PhoneWindow.java:2194) 在android.app。 Activity.onRestoreInstanceState(活動。的java:1092)在 android.app.Activity.performRestoreInstanceState(Activity.java:1037) 在 android.app.Instrumentation.callActivityOnRestoreInstanceState(Instrumentation.java:1175) 在 android.app.ActivityThread.performLaunchActivity(ActivityThread。 Java的:2666) ...... 10多個

+4

[檢查了這一點(http://stackoverflow.com/questions/218384/what-is-a-null-pointer-exception-and-how-do-i-fix-it)。顯然你的' datasource'爲null。 – Codebender

+0

@Codebender,OK,查詢可能無效,但我只指定爲「pendingOrdersList」,我做任何操作那裏。而且,我只檢查它是否返回空值,以便在與ecrash報告指向的行無關的textview中設置一些文本。 –

+0

@Codebender,哦,你也許是對的。抱歉。但我初始化數據源onResume()。請看我更新的問題。 –

回答

1

要小心,當你在onCreateOptionsMenu()使用自定義代碼:該方法可以在的onCreate之後的任何時間(被稱爲),根據不同的Android版本和其他因素。當調用該方法時,您的數據源顯然尚未準備好,因此您也必須處理該情況。

我可以建議你測試,如果數據源是初始化菜單項之前空的,只要你的數據源已準備就緒,初始化的項目,如果還沒有完成。

+0

謝謝,我做了一些測試,並嘗試這個方向。 –

相關問題