#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:
В некоторых случаях это происходит, для этого вам следует попробовать некоторые шаги, упомянутые ниже:
- Попробуйте очистить свой проект.
- Проверьте, работает ли Android.Импортирован файл R class или нет, если он импортирован, то удалите его и импортируйте свой файл R class.
- Попробуйте использовать getResources().getString(R.строка.метод myString).
Ответ №4:
если у вас возникла ошибка при передаче некоторого текста из одного действия в другое, например
StudentID = getIntent().getExtras().getString("Value");
getString выдает исключение с нулевым указателем, затем
этот StudentID имеет строковый тип, поэтому просто объявите StudentID как
private String StudentID;