Как отловить список ArrayAdapter NullPointerException, если вы не знаете, где именно причина сбоя? - PullRequest
0 голосов
/ 17 мая 2018

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

Здесьжурнал ошибок.

java.lang.NullPointerException: 
 at android.widget.ArrayAdapter.createViewFromResource (ArrayAdapter.java:401)
 at android.widget.ArrayAdapter.getView (ArrayAdapter.java:369)
 at android.widget.AbsListView.obtainView (AbsListView.java:3073)
 at android.widget.ListView.makeAndAddView (ListView.java:1945)
 at android.widget.ListView.fillDown (ListView.java:719)
 at android.widget.ListView.fillFromTop (ListView.java:785)
 at android.widget.ListView.layoutChildren (ListView.java:1735)
 at android.widget.AbsListView.onLayout (AbsListView.java:2860)
 at android.view.View.layout (View.java:18014)
 at android.view.ViewGroup.layout (ViewGroup.java:5911)
 at android.widget.LinearLayout.setChildFrame (LinearLayout.java:1742)
 at android.widget.LinearLayout.layoutVertical (LinearLayout.java:1585)
 at android.widget.LinearLayout.onLayout (LinearLayout.java:1494)
 at android.view.View.layout (View.java:18014)
 at android.view.ViewGroup.layout (ViewGroup.java:5911)
 at android.widget.RelativeLayout.onLayout (RelativeLayout.java:1080)
 at android.view.View.layout (View.java:18014)
 at android.view.ViewGroup.layout (ViewGroup.java:5911)
 at android.support.design.widget.HeaderScrollingViewBehavior.layoutChild (HeaderScrollingViewBehavior.java:132)
 at android.support.design.widget.ViewOffsetBehavior.onLayoutChild (ViewOffsetBehavior.java:42)
 at android.support.design.widget.AppBarLayout$ScrollingViewBehavior.findFirstDependency (AppBarLayout.java:1361)
 at android.support.design.widget.AppBarLayout$ScrollingViewBehavior.onMeasureChild (AppBarLayout.java:1361)
 at android.support.design.widget.AppBarLayout$ScrollingViewBehavior.onLayoutChild (AppBarLayout.java:1361)
 at android.support.design.widget.CoordinatorLayout.onLayout (CoordinatorLayout.java:894)
 at android.view.View.layout (View.java:18014)
 at android.view.ViewGroup.layout (ViewGroup.java:5911)
 at android.support.v4.widget.DrawerLayout.onLayout (DrawerLayout.java:1171)
 at android.view.View.layout (View.java:18014)
 at android.view.ViewGroup.layout (ViewGroup.java:5911)
 at android.widget.FrameLayout.layoutChildren (FrameLayout.java:344)
 at android.widget.FrameLayout.onLayout (FrameLayout.java:281)
 at android.view.View.layout (View.java:18014)
 at android.view.ViewGroup.layout (ViewGroup.java:5911)
 at android.widget.LinearLayout.setChildFrame (LinearLayout.java:1742)
 at android.widget.LinearLayout.layoutVertical (LinearLayout.java:1585)
 at android.widget.LinearLayout.onLayout (LinearLayout.java:1494)
 at android.view.View.layout (View.java:18014)
 at android.view.ViewGroup.layout (ViewGroup.java:5911)
 at android.widget.FrameLayout.layoutChildren (FrameLayout.java:344)
 at android.widget.FrameLayout.onLayout (FrameLayout.java:281)
 at android.view.View.layout (View.java:18014)
 at android.view.ViewGroup.layout (ViewGroup.java:5911)
 at android.widget.LinearLayout.setChildFrame (LinearLayout.java:1742)
 at android.widget.LinearLayout.layoutVertical (LinearLayout.java:1585)
 at android.widget.LinearLayout.onLayout (LinearLayout.java:1494)
 at android.view.View.layout (View.java:18014)
 at android.view.ViewGroup.layout (ViewGroup.java:5911)
 at android.widget.FrameLayout.layoutChildren (FrameLayout.java:344)
 at android.widget.FrameLayout.onLayout (FrameLayout.java:281)
 at com.android.internal.policy.PhoneWindow$DecorView.onLayout (PhoneWindow.java:3175)
 at android.view.View.layout (View.java:18014)
 at android.view.ViewGroup.layout (ViewGroup.java:5911)
 at android.view.ViewRootImpl.performLayout (ViewRootImpl.java:2784)
 at android.view.ViewRootImpl.performTraversals (ViewRootImpl.java:2477)
 at android.view.ViewRootImpl.doTraversal (ViewRootImpl.java:1544)
 at android.view.ViewRootImpl$TraversalRunnable.run (ViewRootImpl.java:7616)
 at android.view.Choreographer$CallbackRecord.run (Choreographer.java:911)
 at android.view.Choreographer.doCallbacks (Choreographer.java:686)
 at android.view.Choreographer.doFrame (Choreographer.java:622)
 at android.view.Choreographer$FrameDisplayEventReceiver.run (Choreographer.java:897)
 at android.os.Handler.handleCallback (Handler.java:739)
 at android.os.Handler.dispatchMessage (Handler.java:95)
 at android.os.Looper.loop (Looper.java:148)
 at android.app.ActivityThread.main (ActivityThread.java:7422)
 at java.lang.reflect.Method.invoke (Method.java)
 at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run (ZygoteInit.java:1230)
 at com.android.internal.os.ZygoteInit.main (ZygoteInit.java:1120)

Кажется, проблема связана с ListView, моя структура кода выглядит примерно так:

public class MyActivity extends Activity {
    ArrayAdapter<String> arrayAdapter
    private ListView lv;
    List<String> mylist;
    public void onCreate(Bundle saveInstanceState) {
         setContentView(R.layout.your_layout);
         lv = (ListView) findViewById(R.id.your_list_view_id);
         arrayAdapter = new ArrayAdapter<String>(this, android.R.layout.simple_list_item_1, mylist );
         refreshList();
         lv.setAdapter(arrayAdapter); 
    }

    ArrayList<String> populateList(){
        //create a new list arraylist of strings 
        //this method produces list with all non null values, so cannot be 
        //the cause of the issue
        ...
    }
    void refreshList(){
         mylist = populateList();
         arrayAdapter.notifyDataSetChanged();
    }

    void clearList(){
        if(mylist!=null){
            mylist.clear();
            arrayAdapter.notifyDataSetChanged();
        }
    }

}

populateList() метод всегда возвращает список всех ненулевыхэлементы, и я не имею ни малейшего представления о причине ошибки.Как я могу уловить проблему?

1 Ответ

0 голосов
/ 18 мая 2018

Установите точку останова после заполнения списка и проверки его в отладчике, не доверяйте своей интуиции насчет того, что он содержит, проверяя, не повредит ли он.

Или перейдите к ArrayAdapter:401 (как сказанопо трассировке стека) и посмотрите, какое утверждение есть, если оно text.setText(item.toString());, то это определенно нулевой элемент, в противном случае из оператора там вы поймете источник вашей проблемы.

Чтобы открыть ArrayAdapter класс вAndroid Studio / IDEA дважды нажмите Shift , введите имя класса и откройте его (или щелкните его правой кнопкой мыши и выберите «Перейти к -> Объявление»), затем перейдите к строке 401, наиболее вероятно, этобудет источником вашего исключения.

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

...