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)
Почему я получаю NullPointerException
? И где я должен сохранить файл resources.properties
?
Ответы
Ответ 1
Похоже, ClassLoader.getResourceAsStream(String name)
возвращает null
, что приводит к тому, что Properties.load
бросает NullPointerException
.
Здесь выдержка из документации:
URL getResource(String name)
: находит ресурс с заданным именем. Ресурсом являются некоторые данные (изображения, аудио, текст и т.д.), К которым можно получить доступ с помощью кода класса таким образом, который не зависит от местоположения кода.
Имя ресурса - это '/'
-разделенный путь, который идентифицирует ресурс.
Возвращает: объект URL
для чтения ресурса или null
, если:
- ресурс не найден, или
- у invoker нет достаточных привилегий для получения ресурса.
См. также
Ответ 2
Исправление ошибок проще, если вы пишете больше строк, например:
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!
}
Ответ 3
У меня была такая же проблема, и я был довольно смущен, поскольку использовал его ранее в приложении Стерты. Но проблема заключалась в том, что я не понял тип ClassLoader, который возвращает Struts, чем возвращает Spring. И, как я понял, я распечатал объект, который был возвращен на системную консоль следующим образом:
System.out.println(Thread.currentThread().getContextClassLoader());
[
WebappClassLoader
context:/MyProject
делегат: false
Хранилища:
/WEB -INF/классы/
---------- > Родительский загрузчик классов:
[email protected]
]
Он дал мне деталь объекта, и в этом я нашел его тип WebAppClassLoader, который начнет искать файлы в папке WEB-INF/classes/после сборки., Поэтому я вошел в эту папку и искал, где находится мой файл, поэтому я дал путь соответственно.
В моем случае он находился в /WEB -INF/classes/META-INF/ spring/filename.extension
InputStream in = Thread.currentThread().getContextClassLoader().getResourceAsStream("META-INF/spring/filename.extension");
Вуаля!
Это исправило все.
Ответ 4
У меня была та же проблема, и я решил, выполнив следующие
-
File file = new File("resources.properties");
-
System.out.println(file.getAbsolutePath());
а затем поместите файл "resources.properties" в этот путь.
Ответ 5
Ну, это зависит; Согласно javadoc...
Контекст ClassLoader предоставляется создателем потока для использования кодом, запущенным в этом потоке при загрузке классов и ресурсов. Если не задано, по умолчанию используется контекст ClassLoader родительского потока. Контекст ClassLoader из первичного потока обычно устанавливается в загрузчик классов, используемый для загрузки приложения...
Итак, если Thread.currentThread().getContextClassLoader()
находится в функции main(), и вы не создали ни одного потока, то он должен иметь тот же пакет, что и класс класса, содержащего метод main. В противном случае он должен присутствовать в классе, который создал поток....
Ответ 6
У меня была эта проблема с сторонней программой, и оказалось, что мне нужно включить .
в путь к классам, чтобы программа могла читать локальный файл свойств в текущем рабочем каталоге.
Ответ 7
У многих, кажется, есть эта проблема, и, как и я, они перестают после этого. Вот что мне нужно было сделать. Трюк здесь для использования относительного пути для поиска файлов заключается в том, чтобы убедиться, что ваша папка классов содержит файлы ресурсов вместе с файлами src. Вот что я сделал.
1) Если вы используете eclipse, убедитесь, что у вас есть правильный параметр .classpath и PROJECT CLEAN, чтобы увидеть, как файлы ресурсов генерируются в/классах. Обратите внимание на приведенные ниже классы pathpath для файлов ресурсов в разделе src/main/resource
<?xml version="1.0" encoding="UTF-8"?>
<classpath>
<classpathentry including="**/*.java" kind="src" output="target/test-classes" path="src/test/java"/>
<classpathentry including="**/*.java" kind="src" path="src/main/java"/>
<classpathentry kind="var" path="M2_REPO/javax/mail/mail/1.4.4/mail-1.4.4.jar"/>
<classpathentry kind="var" path="M2_REPO/javax/activation/activation/1.1/activation-1.1.jar"/>
<classpathentry kind="var" path="M2_REPO/junit/junit/3.8.1/junit-3.8.1.jar"/>
<classpathentry kind="con" path="org.eclipse.jdt.launching.JRE_CONTAINER"/>
<classpathentry kind="output" path="target/classes"/>
</classpath>
2) Если вы также используете maven, убедитесь, что вы настроили свой pom.xml в соответствии с https://maven.apache.org/guides/introduction/introduction-to-the-pom.html и выполните mvn clean install для просмотра файлов под целевыми/классами
3) После того, как вы получили файлы ресурсов под /classes, следующая вещь, которую нужно сделать в java, следующая. Не забывайте иметь косую черту.
try {
properties.load(getClass().getResourceAsStream("/mail-config.properties"));
} catch (IOException e) {
e.printStackTrace();
}
Я мог бы добавить некоторые изображения, но не имел точек.:)
Ответ 8
Возможно, я вырвал все мои волосы и пошел, я нашел это решение:
Properties dbParamProperties = new Properties();
InputStream input = null;
try {
String pathOfAbsolute = this.getClass().getProtectionDomain().getCodeSource().getLocation().toString();
String propertiesFilePath = pathOfAbsolute+"/properties/conf.properties";
propertiesFilePath = propertiesFilePath.replace("file:/", "").replace("/", "\\");
System.out.println(pathOfAbsolute);
System.out.println(propertiesFilePath);
Paths.get(new URI(pathOfAbsolute));
input = ClassLoader.getSystemResourceAsStream(propertiesFilePath);
input = new FileInputStream(propertiesFilePath);
dbParamProperties.load( input );
dbUID = dbParamProperties.getProperty("userName");
dbURL = dbParamProperties.getProperty("hosturl");
dbPWD = dbParamProperties.getProperty("password");
dbPort = dbParamProperties.getProperty("port");
dbSID = dbParamProperties.getProperty("servicenameorsid");
} catch (IOException e) {
e.printStackTrace();
}
catch(Exception ex){
ex.printStackTrace();
}
Ответ 9
У меня была та же проблема, и это помогло мне:
InputStream is;
try {
is = this.getClass().getClassLoader().getResourceAsStream("config.properties");
prop.load(is);
String url = prop.getProperty("url");
String user = prop.getProperty("user");
String pass = prop.getProperty("password");
is.close();
// opening database connection to MySQL server
con = DriverManager.getConnection(url, user, pass);
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
} catch (SQLException e) {
e.printStackTrace();
}
Ответ 10
В моей ситуации я получаю NullPointerException в этом коде
LogManager.getLogManager()
.readConfiguration(MyClass.class.getResourceAsStream("config/logging.properties"));
Я изменил
LogManager.getLogManager().readConfiguration(AzLotteryTerm.class.getClassLoader().getResourceAsStream("config/logging.properties"));
и теперь работает нормально!
Ответ 11
String pathOfAbsolute = this.getClass().getProtectionDomain().getCodeSource().getLocation().toString();
String propertiesFilePath = pathOfAbsolute+"/conf.properties";
propertiesFilePath = propertiesFilePath.replace("file:/", "").replace("/", "\\");