Странное исключение NullPointerException

#android #nullpointerexception #runtimeexception

#Android #исключение nullpointerexception #исключение runtimeexception

Вопрос:

У меня странная проблема…

Мой файл strings.xml содержит:

 <?xml version="1.0" encoding="utf-8?>
<resources>
    <string name="building_name">My House</string>
</resources>
  

Ну, мой R содержит:

 [...]
public static final class String {
    public static final int building_name=0x7f02383;
}
[...]
  

Итак, когда я пытаюсь вызвать эту строку в своем коде следующим образом:

 private final String BUILDING_NAME = getString(R.string.building_name);
  

У меня эта ошибка:

 java.lang.RuntimeException: Unable to instanciate activity ComponentInfo{...}:          java.lang.NullPointerException
{...}
  caused by: java.lang.NullPointerException
  

в {строке, где я создаю экземпляр building_name}

Что не так с моим кодом?Пожалуйста, помогите

Комментарии:

1. Вы импортировали свой R-класс, а не Android. Класс R?

2. Все в порядке, я нашел решение, спасибо! (посмотрите на другие ответы)

Ответ №1:

Вы не можете выполнить вызов getString до инициализации вашей активности. Это потому, что getString это то же самое, что context.getResources().getString() . И контекст не инициализирован.

Таким образом, в принципе, вы не можете присваивать значение статическим переменным таким образом.

Но есть способ использовать строки ресурсов в ваших статических переменных. Для этого создайте свое приложение (см. Это и это), а затем извлеките оттуда контекст. Вот краткий пример:

 <manifest ...>
    ...
    <application  android:name="com.mypackage.MyApplication" ... >
       ...
    </application>
    ...
</manifest>
  

Затем создайте MyApplication.java файл:

 public class MyApplication extends Application 
{   
    private static MyApplication s_instance;

    public MyApplication ()
    {
        s_instance = this;
    }

    public static Context getContext()
    {
        return s_instance;
    }

    public static String getString(int resId)
    {
        return getContext().getString(resId);       
    }
}
  

А затем используйте его для получения строкового ресурса:

 private final String BUILDING_NAME = MyApplication.getString(R.string.building_name);
  

Вы даже можете сделать это для статических полей.

Комментарии:

1. 1, потрясающе — я сам получил версию этой ошибки. Отличное объяснение.

Ответ №2:

Использование этого может помочь вам

 getResources().getString(R.string.building_name);
  

Это работает для меня

Ответ №3:

В некоторых случаях это происходит, для этого вам следует попробовать некоторые шаги, упомянутые ниже:

  1. Попробуйте очистить свой проект.
  2. Проверьте, работает ли Android.Импортирован файл R class или нет, если он импортирован, то удалите его и импортируйте свой файл R class.
  3. Попробуйте использовать getResources().getString(R.строка.метод myString).

Ответ №4:

если у вас возникла ошибка при передаче некоторого текста из одного действия в другое, например

 StudentID = getIntent().getExtras().getString("Value");
  

getString выдает исключение с нулевым указателем, затем

этот StudentID имеет строковый тип, поэтому просто объявите StudentID как

private String StudentID;