Исключение нулевого указателя при попытке создать диалоговое окно предупреждения

Я пытался использовать код, приведенный в ответе на вопрос это, хотя я решил не использовать отдельный класс для ListAdapter. Когда я пытаюсь начать свою деятельность (InfosActivity), приложение вылетает, вот журнал:

05-02 11:50:22.195 7521-7521/com.example.uia59227.User_and_Car_Data E/AndroidRuntime: FATAL EXCEPTION: main
                                                                                  Process: com.example.uia59227.User_and_Car_Data, PID: 7521
                                                                                  java.lang.RuntimeException: Unable to instantiate activity ComponentInfo{com.example.uia59227.User_and_Car_Data/com.example.uia59227.User_and_Car_Data.InfosActivity}: java.lang.NullPointerException: Attempt to invoke virtual method 'android.content.Context android.content.Context.getApplicationContext()' on a null object reference
                                                                                      at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2849)
                                                                                      at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:3045)
                                                                                      at android.app.ActivityThread.-wrap14(ActivityThread.java)
                                                                                      at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1642)
                                                                                      at android.os.Handler.dispatchMessage(Handler.java:102)
                                                                                      at android.os.Looper.loop(Looper.java:154)
                                                                                      at android.app.ActivityThread.main(ActivityThread.java:6776)
                                                                                      at java.lang.reflect.Method.invoke(Native Method)
                                                                                      at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1496)
                                                                                      at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1386)
                                                                                   Caused by: java.lang.NullPointerException: Attempt to invoke virtual method 'android.content.Context android.content.Context.getApplicationContext()' on a null object reference
                                                                                      at android.content.ContextWrapper.getApplicationContext(ContextWrapper.java:106)
                                                                                      at com.example.uia59227.User_and_Car_Data.InfosActivity.<init>(InfosActivity.java:223)
                                                                                      at java.lang.Class.newInstance(Native Method)
                                                                                      at android.app.Instrumentation.newActivity(Instrumentation.java:1086)
                                                                                      at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2839)
                                                                                      at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:3045) 
                                                                                      at android.app.ActivityThread.-wrap14(ActivityThread.java) 
                                                                                      at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1642) 
                                                                                      at android.os.Handler.dispatchMessage(Handler.java:102) 
                                                                                      at android.os.Looper.loop(Looper.java:154) 
                                                                                      at android.app.ActivityThread.main(ActivityThread.java:6776) 
                                                                                      at java.lang.reflect.Method.invoke(Native Method) 
                                                                                      at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1496) 
                                                                                      at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1386) 

Я прочитал несколько тем об исключении NullPointer, но все еще не могу найти решение.

Вот мой ListAdapter:

String[] items = {"airplanes", "animals", "cars", "colors", "flowers", "letters", "monsters", "numbers", "shapes", "smileys", "sports", "stars" };

ListAdapter adapter = new ArrayAdapter<String>(getApplicationContext(), R.layout.list_row, items) {

    ViewHolder holder;
    Drawable icon;

    class ViewHolder {
        ImageView icon;
        TextView title;
    }

    public View getView(int position, View convertView, ViewGroup parent) {
        final LayoutInflater inflater = (LayoutInflater) getApplicationContext().getSystemService(Context.LAYOUT_INFLATER_SERVICE);

        if (convertView == null) {
            convertView = inflater.inflate(R.layout.list_row, null);

            holder = new ViewHolder();
            holder.icon = (ImageView) convertView.findViewById(R.id.icon);
            holder.title = (TextView) convertView.findViewById(R.id.title);
            convertView.setTag(holder);
        } else {
            // view already defined, retrieve view holder
            holder = (ViewHolder) convertView.getTag();
        }

        Drawable drawable = ContextCompat.getDrawable(context,R.drawable.ic_person); //this is an image from the drawables folder

        holder.title.setText(items[position]);
        holder.icon.setImageDrawable(drawable);

        return convertView;
    }
};

И как я его использую:

quickReviewButton.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View arg0) {
            AlertDialog.Builder alertDialogBuilder = new AlertDialog.Builder(context);
            alertDialogBuilder
                    .setTitle("Full report")
                    .setAdapter(adapter, new DialogInterface.OnClickListener() {
                        @Override
                        public void onClick(DialogInterface dialog, int item) {
                            Toast.makeText(InfosActivity.this, "You selected: " + items[item], Toast.LENGTH_LONG).show();
                            dialog.dismiss();
                        }
                    });

            // create alert dialog
            AlertDialog alertDialog = alertDialogBuilder.create();

            // show it
            alertDialog.show();
        }
    });

Не могли бы вы мне помочь ?

Опубликуйте полную трассировку стека, пожалуйста, и покажите нам, в какой строке попадает NullPointerException

Kleo G 02.05.2018 13:22

Готово, но я не уверен, где возникает исключение

Loic T 02.05.2018 13:28

Строка, вызывающая ошибку, - это строка 223 в вашем InfoActivity.

vincrichaud 02.05.2018 13:32

Тогда это объявление моего адаптера ListAdapter, но я не знаю, что я могу для него сделать.

Loic T 02.05.2018 13:35

это в одном мероприятии? вам не нужно использовать getapplicationcontext, вместо этого используйте это для контекста

Gastón Saillén 02.05.2018 13:41
ListAdapter adapter = new ArrayAdapter<String>(getApplicationContext(), R.layout.list_row, items) {...} этот фрагмент кода вызывает ошибку
Umer Farooq 02.05.2018 13:49

Gastón Saillén действительно работает, но не решает проблему

Loic T 02.05.2018 13:51
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
0
7
215
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Проблема в том, что вы создаете экземпляр своего ListAdapter в объявлении. Таким образом, создание экземпляра выполняется во время создания экземпляра класса InfoActivity (то есть до того, как создание экземпляра будет завершено). Если InfoActivity не завершил создание экземпляра, this - это null. Итак, когда вы делаете getApplicationContext(), вы делаете this.getapplicationContext(), но this нулевой.

Вы должны создать экземпляр своего ListAdapter после создания экземпляра Activity. Таким образом, вы можете, например, создать экземпляр своего Listadapter в методе onStart ().


Более того, как объясняется в этом комментарий, если вам нужен контекст вашей активности, используйте this вместо getApplicationContext()

@ downvoter, не могли бы вы оставить отзыв? Так что я могу улучшить свой ответ

vincrichaud 02.05.2018 13:54

Я возвращаюсь к вам, поскольку у меня все еще есть исключение NullPointerException, указывающее на строку holder.icon.setImageDrawable(drawable);. В определении getview у меня есть предупреждение на parent, в котором написано not annotated parameter overrides @NonNull parameter, и я не знаю, является ли это причиной моей ошибки.

Loic T 02.05.2018 15:15

Это означает, что либо holder, либо icon равно нулю. holder имеет значение null, если вы пройдете через else и convertView.getTag () вернет null. icon имеет значение null, если вы проходите if, а findViewById() не может найти представление, имеющее R.id.icon в качестве идентификатора, или вы проходите через else, и объект, возвращаемый convertView.getTag(), имеет значок поля, который имеет значение null

vincrichaud 02.05.2018 15:20

Хорошо, мне было непросто понять это, но я сделал это, заменил convertView.findViewById(R.id.icon);, которого не существует (я не понимаю, почему у меня не было ошибок), на findViewById(R.id.Car), который действительно существует, и он работает. Спасибо!

Loic T 02.05.2018 15:48

Другие вопросы по теме