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("/", "\\");