2015-07-10 2 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) запускается прямо перед тем, как я его использую, почему он говорит, что это null?

Line, где я инициализировать базу данных:

@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) на android.os.Handler.dispatchMessage (Handler.java:102) на android.os.Looper.loop (Looper.java:145) на android.app.ActivityThread.main (ActivityThread.java:5942) в java.lang.reflect.Method.invoke (собственный метод) в java.lang.reflect.Method.invoke (Method.java:372) на 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 пустой объект ссылка на foto.studio.MainActivity.onCreateOptionsMenu (MainActivity.java:267) при android.app.Activity.onCreatePanelMenu (Activity.java:2947) при com.android.internal.policy.impl.PhoneWindow .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) в 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, нормально, запрос может быть нулевым, но я назначаю его только «pendingOrdersList», там никаких операций нет. И я вижу только, возвращает ли он значение null, чтобы установить текст в текстовом виде, который не имеет никакого отношения к строке, на которую указывает отчет ecrash. –

+0

@Codebender, о, ты, возможно, прав. Сожалею. Но я инициализирую datasource onResume(). См. Мой обновленный вопрос. –

ответ

1

Будьте осторожны при использовании пользовательского кода в onCreateOptionsMenu(): этот метод может быть вызван в любое время после OnCreate(), в зависимости от версии Android и других факторов. Ваш источник данных, очевидно, еще не готов при вызове метода, поэтому вы также должны обработать этот случай.

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

+0

спасибо, я немного тестирую и стараюсь в этом направлении. –

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