加载属性文件时出现空指针异常

Posted

技术标签:

【中文标题】加载属性文件时出现空指针异常【英文标题】:Getting Null pointer exception while loading properties file 【发布时间】:2020-06-23 02:46:42 【问题描述】:

我正在尝试在 maven 项目(IntelliJ IDE)中加载属性文件。 加载时我面临空​​指针异常。

例外

java.lang.NullPointerException
    at java.util.Properties$LineReader.readLine(Properties.java:434)
    at java.util.Properties.load0(Properties.java:353)
    at java.util.Properties.load(Properties.java:341)
    at main.com.bby.dao.EventListDao.getEventList(EventListDao.java:29)
    at main.com.bby.controller.EventController.allEventLists(EventController.java:39)
    at main.com.bby.controller.EventController.getAllEventLists(EventController.java:32)
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
    at java.lang.reflect.Method.invoke(Method.java:498)
    at com.sun.jersey.spi.container.JavaMethodInvokerFactory$1.invoke(JavaMethodInvokerFactory.java:60)
    at com.sun.jersey.server.impl.model.method.dispatch.AbstractResourceMethodDispatchProvider$TypeOutInvoker._dispatch(AbstractResourceMethodDispatchProvider.java:185)
    at com.sun.jersey.server.impl.model.method.dispatch.ResourceJavaMethodDispatcher.dispatch(ResourceJavaMethodDispatcher.java:75)
    at com.sun.jersey.server.impl.uri.rules.HttpMethodRule.accept(HttpMethodRule.java:302)
    at com.sun.jersey.server.impl.uri.rules.RightHandPathRule.accept(RightHandPathRule.java:147)
    at com.sun.jersey.server.impl.uri.rules.ResourceClassRule.accept(ResourceClassRule.java:108)
    at com.sun.jersey.server.impl.uri.rules.RightHandPathRule.accept(RightHandPathRule.java:147)
    at com.sun.jersey.server.impl.uri.rules.RootResourceClassesRule.accept(RootResourceClassesRule.java:84)
    at com.sun.jersey.server.impl.application.WebApplicationImpl._handleRequest(WebApplicationImpl.java:1542)
    at com.sun.jersey.server.impl.application.WebApplicationImpl._handleRequest(WebApplicationImpl.java:1473)
    at com.sun.jersey.server.impl.application.WebApplicationImpl.handleRequest(WebApplicationImpl.java:1419)
    at com.sun.jersey.server.impl.application.WebApplicationImpl.handleRequest(WebApplicationImpl.java:1409)
    at com.sun.jersey.spi.container.servlet.WebComponent.service(WebComponent.java:409)
    at com.sun.jersey.spi.container.servlet.ServletContainer.service(ServletContainer.java:558)
    at com.sun.jersey.spi.container.servlet.ServletContainer.service(ServletContainer.java:733)
    at javax.servlet.http.HttpServlet.service(HttpServlet.java:741)
    at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:231)
    at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166)
    at org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:53)
    at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193)
    at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166)
    at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:199)
    at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:96)
    at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:494)
    at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:137)
    at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:92)
    at org.apache.catalina.valves.AbstractAccessLogValve.invoke(AbstractAccessLogValve.java:651)
    at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:87)
    at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:343)
    at org.apache.coyote.http11.Http11Processor.service(Http11Processor.java:407)
    at org.apache.coyote.AbstractProcessorLight.process(AbstractProcessorLight.java:66)
    at org.apache.coyote.AbstractProtocol$ConnectionHandler.process(AbstractProtocol.java:754)
    at org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.doRun(NioEndpoint.java:1376)
    at org.apache.tomcat.util.net.SocketProcessorBase.run(SocketProcessorBase.java:49)
    at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1149)
    at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:624)
    at org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:61)
    at java.lang.Thread.run(Thread.java:748)

下面是一段代码

        Properties prop = new Properties();
        Thread currentThread = Thread.currentThread();
        ClassLoader contextClassLoader = currentThread.getContextClassLoader();
        InputStream propFile = contextClassLoader.getResourceAsStream("db.properties");
        prop.load(propFile);
        System.out.println("Properties file loaded!!");
        propFile.close();

项目的文件夹结构

下面是类加载器的结果:

ParallelWebappClassLoader
  context: Dashboard
  delegate: false
----------> Parent Classloader:
java.net.URLClassLoader@675d3402

我几乎在每一页上都搜索了修复程序,但还是不走运。这就是为什么我不得不将其发布为新问题。 如有语法错误,敬请原谅。 并感谢您的帮助。

【问题讨论】:

你的属性文件应该在资源文件夹中µ 你检查过 propFile 对象了吗?我认为它是空的。在这种情况下,找不到您的 db.properties 文件。 学习调试。请尝试以下操作以了解 NPE 是否是由于找不到路径或其他原因File file = new File("db.properties"); System.out.println(file.getAbsolutePath()); 【参考方案1】:

db.properties 文件放入src/main/resources 文件夹,然后您应该可以访问它

【讨论】:

我已经在我的电脑上验证了这个并且它有效,希望它也适用于 OP。 谢谢您。它正在工作。在 src/main/resources 文件夹下添加了我的属性【参考方案2】:

首先创建以下结构:

src/main/java/%你所有的包和类都在这里% src/main/resources/%把所有不是java代码的都放在这里%

然后,右键单击资源文件夹并将其标记为 Resources Root,对 java 文件夹执行相同操作,但将其标记为 Sources Root。

构建项目,您应该能够使用 db.properties 加载

System.class.getResourceAsStream("/path/to/db.properties");

希望这会有所帮助。如果您遇到其他问题,请随时在下方发表评论。

【讨论】:

【参考方案3】:

这对我有用:

test.properties 保存在 src/main/resources 中

test.properties:

com.test.name=JohnDoe

Application.java:

package com.test;

import java.io.IOException;
import java.io.InputStream;
import java.util.Properties;

public class Application 

    public static void main(String[] args) throws IOException 
        Properties properties = new Properties();

        try(InputStream is = Application.class.getResourceAsStream("/test.properties")) 
            properties.load(is);
        

        System.out.println(properties.getProperty("com.test.name"));
    


控制台输出:

JohnDoe

Process finished with exit code 0

【讨论】:

【参考方案4】:

IDE 在此处遵循 Maven 规则。由于 Maven 默认不会复制不在src/main/resources 文件夹中的资源。您应该将它们复制到此文件夹或配置 maven 以在编译时包含它们,例如:

<build>
  ...
  <resources>
    <resource>
      <directory>$project.build.sourceDirectory</directory>
      <includes>
        <include>**/*.vm</include>
      </includes>
    </resource>
  </resources>
  ...
</build>

【讨论】:

以上是关于加载属性文件时出现空指针异常的主要内容,如果未能解决你的问题,请参考以下文章

使用 Java 编译器 API 时出现空指针异常

使用Tomcat服务器时出现空指针异常!

HomeBaseFragment 运行时出现空指针异常

在 Java 中测试时出现空指针异常

从活动调用片段方法时出现空指针异常

从firebase检索时出现空指针异常[重复]