在Java中读取属性文件时出现NullPointerException

时间:2010-06-29 09:49:21

标签: java nullpointerexception inputstream

我使用以下代码来读取属性文件:

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文件?

11 个答案:

答案 0 :(得分:19)

看起来ClassLoader.getResourceAsStream(String name)会返回null,然后会导致Properties.load抛出NullPointerException

以下是文档摘录:

  

URL getResource(String name):查找具有给定名称的资源。资源是一些数据(图像,音频,文本等),可以通过类代码以独立于代码位置的方式访问。

     

资源的名称是'/' - 用于标识资源的分隔路径名。

     

返回:用于阅读资源的URL对象,或{:1}}如果:

     
      
  • 无法找到资源,或
  •   
  • 调用者没有足够的权限来获取资源。
  •   

另见

答案 1 :(得分:6)

如果您编写更多行,错误修正会更容易,例如:

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 :(得分:2)

我遇到了同样的问题,因为我之前在 Sturts 应用程序中使用它而感到非常困惑。但问题是我不理解 Struts 返回的ClassLoader类型与 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.extension

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

瞧!

解决了这一切。

答案 3 :(得分:2)

如果日蚀会清洁项目,并且如果是intellij重建项目,则应该开始工作

答案 4 :(得分:1)

我遇到了同样的问题,我通过以下方式解决了问题

  1. File file = new File("resources.properties");
  2. System.out.println(file.getAbsolutePath());
  3. 然后将“resources.properties”文件放在该路径下。

答案 5 :(得分:0)

这取决于;按照javadoc ...... 上下文ClassLoader由线程的创建者提供,供加载类和资源时在此线程中运行的代码使用。如果未设置,则默认为父线程的ClassLoader上下文。原始线程的上下文ClassLoader通常设置为用于加载应用程序的类加载器...

因此,如果{(1}}在main()函数中并且您没有创建任何线程,那么它应该与包含方法main的类具有相同的包。否则它应该出现在创建线程的类中....

答案 6 :(得分:0)

我遇到了第三方程序的问题,结果我需要在类路径中包含.,以便程序可以读取当前工作目录中的本地属性文件。

答案 7 :(得分:0)

许多人似乎有这个问题,像我一样,他们会在一段时间后放弃。这是我必须得到的工作。这里使用相对路径进行文件查找的技巧是确保 classes文件夹包含资源文件以及src文件。这就是我最终要做的事情。

1)如果您正在使用eclipse,请确保存在正确的.classpath设置并执行 PROJECT CLEAN 以查看在/ classes下生成的资源文件。请注意下面的资源文件的类路径条目位于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,请确保按照https://maven.apache.org/guides/introduction/introduction-to-the-pom.html配置pom.xml并执行mvn clean install以查看target / classes下的文件

3)一旦你获得了/ classes下的资源文件,下面要做的事情就是以下内容。不要忘记有正斜杠。

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

我本可以添加一些图片,但没有积分。 :)

答案 8 :(得分:0)

也许,我把所有的头发都拿出去然后我找到了解决方案:

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 :(得分:0)

我遇到了同样的问题,这对我有所帮助:

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 :(得分:-1)

在我的场景中,我在这段代码中得到了NullPointerException

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

我改变了

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

现在工作正常!