NullPointerException при чтении файла свойств в Java - PullRequest
17 голосов
/ 29 июня 2010

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

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?

Ответы [ 10 ]

19 голосов
/ 29 июня 2010

Похоже, ClassLoader.getResourceAsStream(String name) возвращает null, в результате чего Properties.load выдает NullPointerException.

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

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

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

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

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

См. также

6 голосов
/ 29 июня 2010

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

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!
}
2 голосов
/ 27 декабря 2012

У меня была та же проблема, и я был совершенно сбит с толку, поскольку использовал ее ранее в приложении Sturts .Но проблема заключалась в том, что я не понимал тип ClassLoader, который возвращает Struts отличается от того, что возвращает Spring .И я понял, что распечатал объект, который был возвращен на системную консоль следующим образом:

System.out.println(Thread.currentThread().getContextClassLoader());

[WebappClassLoaderконтекст: / MyProjectделегат: ложьхранилища:/ WEB-INF / классы /----------> Родительский загрузчик классов:org.apache.catalina.loader.StandardClassLoader@1004901]

Он дал мне подробную информацию об объекте, и я обнаружил, что его тип имеет вид WebAppClassLoader , который начнет искать файлы в папке WEB-INF / classes / послеСборка завершена.Поэтому я зашел в эту папку и посмотрел, где находится мой файл, поэтому я дал соответствующий путь.

В моем случае он был расположен в / WEB-INF / classes / META-INF / spring / filename.расширение

InputStream in = Thread.currentThread().getContextClassLoader().getResourceAsStream("META-INF/spring/filename.extension");

Вуаля!

Это все исправило.

1 голос
/ 08 ноября 2013

У меня была та же проблема, и я решил, выполнив следующие действия:

  1. File file = new File("resources.properties");
  2. System.out.println(file.getAbsolutePath());

и затем поставилфайл resources.properties "по этому пути.

0 голосов
/ 03 июля 2017

У меня была такая же проблема, и это помогло мне:

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();
}
0 голосов
/ 14 сентября 2016

Возможно, я выдернул все волосы и ушел, тогда я нашел это решение:

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();
        }
0 голосов
/ 26 июня 2015

Многие, кажется, имеют эту проблему, и, как и я, они через некоторое время сдаются.Вот то, что я должен был заставить это работать.Хитрость в использовании относительного пути для поиска файлов заключается в том, чтобы убедиться, что ваша папка classes содержит файлы ресурсов вместе с файлами src.Вот что я в итоге сделал.

1) Если вы используете eclipse, убедитесь, что вы правильно установили .classpath, и выполните PROJECT CLEAN , чтобы увидеть файлы ресурсов, сгенерированные в / classes.Обратите внимание на записи classpath ниже для файлов ресурсов, размещенных в 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 для просмотра файлов в папке target / classes

3) После того, как вы получили файлы ресурсов в каталоге / classes, в java необходимо сделать следующее.Не забудьте косую черту.

try {
            properties.load(getClass().getResourceAsStream("/mail-config.properties"));
        } catch (IOException e) {
            e.printStackTrace();
        }

Я мог бы добавить несколько изображений, но у меня не было очков.:)

0 голосов
/ 21 апреля 2015

У меня была эта проблема со сторонней программой, и оказалось, что мне нужно было включить . в classpath, чтобы программа могла читать локальный файл свойств в текущем рабочем каталоге.

0 голосов
/ 08 февраля 2013

В моем случае я получаю исключение NullPointerException в этом коде

LogManager.getLogManager()
      .readConfiguration(MyClass.class.getResourceAsStream("config/logging.properties"));

Я изменил

LogManager.getLogManager().readConfiguration(AzLotteryTerm.class.getClassLoader().getResourceAsStream("config/logging.properties"));

и теперь работает нормально!

0 голосов
/ 29 июня 2010

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

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

...