加载属性文件时出现空指针异常
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>
【讨论】:
以上是关于加载属性文件时出现空指针异常的主要内容,如果未能解决你的问题,请参考以下文章