NullPointerException при чтении файла свойств в Java

Я использую следующий код для чтения файла свойств:

Properties pro = new Properties();
InputStream is = Thread.currentThread().getContextClassLoader().
    getResourceAsStream("resources.properties");

pro.load(is);

И когда я выполняю код, я получаю следующую ошибку:

Exception in thread "main" java.lang.NullPointerException
  at java.util.Properties$LineReader.readLine(Properties.java:418)
  at java.util.Properties.load0(Properties.java:337)
  at java.util.Properties.load(Properties.java:325)
  at com.ibm.rqm.integration.RQMUrlUtility.RQMRestClient.getResource(RQMRestClient.java:66)
  at com.ibm.rqm.integration.RQMUrlUtility.RQMRestClient.main(RQMRestClient.java:50)

Почему я получаю a NullPointerException? И где я должен сохранить resources.properties файл?

18
задан Jasper 19 January 2012 в 09:01
поделиться

3 ответа

Исправлять ошибки легче, если писать больше строк, например:

Properties properties = new Properties();
Thread currentThread = Thread.currentThread();
ClassLoader contextClassLoader = currentThread.getContextClassLoader();
InputStream propertiesStream = contextClassLoader.getResourceAsStream("resource.properties");
if (propertiesStream != null) {
  properties.load(propertiesStream);
  // TODO close the stream
} else {
  // Properties file not found!
}
7
ответ дан 30 November 2019 в 08:15
поделиться

Похоже, ClassLoader.getResourceAsStream (String name) возвращает null , что затем приводит к тому, что Properties.load бросает NullPointerException .

Вот отрывок из документации:

URL getResource (String name) : Находит ресурс с заданным именем.Ресурс - это некоторые данные (изображения, аудио, текст и т. Д.), К которым может получить доступ код класса независимо от местоположения кода.

Имя ресурса - это разделенное '/' имя пути, которое идентифицирует ресурс.

Возвращает: объект URL для чтения ресурса, или null , если:

  • ресурс не может быть найден, или
  • вызывающая сторона не ' t иметь соответствующие привилегии для получения ресурса.

См. Также

19
ответ дан 30 November 2019 в 08:15
поделиться

Ну, это зависит; согласно javadoc ... Контекст ClassLoader предоставляется создателем потока для использования кодом, выполняющимся в этом потоке, при загрузке классов и ресурсов. Если он не задан, то по умолчанию используется контекст ClassLoader родительского потока. Контекст ClassLoader первичного потока обычно устанавливается на загрузчик классов, используемый для загрузки приложения...

Таким образом, если Thread.currentThread().getContextClassLoader() находится в функции main() и вы не создали никакого потока, то он должен иметь тот же пакет, что и класс, содержащий метод main. В противном случае он должен присутствовать в классе, который создал поток....

0
ответ дан 30 November 2019 в 08:15
поделиться
Другие вопросы по тегам:

Похожие вопросы: