Я использую следующий код для чтения файла свойств:
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
файл?
Исправлять ошибки легче, если писать больше строк, например:
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!
}
Похоже, ClassLoader.getResourceAsStream (String name)
возвращает null
, что затем приводит к тому, что Properties.load
бросает NullPointerException
.
Вот отрывок из документации:
URL getResource (String name)
: Находит ресурс с заданным именем.Ресурс - это некоторые данные (изображения, аудио, текст и т. Д.), К которым может получить доступ код класса независимо от местоположения кода.Имя ресурса - это разделенное
'/'
имя пути, которое идентифицирует ресурс.Возвращает: объект
URL
для чтения ресурса, илиnull
, если:
- ресурс не может быть найден, или
- вызывающая сторона не ' t иметь соответствующие привилегии для получения ресурса.
getResource
Ну, это зависит; согласно javadoc ... Контекст ClassLoader предоставляется создателем потока для использования кодом, выполняющимся в этом потоке, при загрузке классов и ресурсов. Если он не задан, то по умолчанию используется контекст ClassLoader родительского потока. Контекст ClassLoader первичного потока обычно устанавливается на загрузчик классов, используемый для загрузки приложения...
Таким образом, если Thread.currentThread().getContextClassLoader()
находится в функции main() и вы не создали никакого потока, то он должен иметь тот же пакет, что и класс, содержащий метод main. В противном случае он должен присутствовать в классе, который создал поток....