我使用以下代码来读取属性文件:
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
文件?
答案 0 :(得分:19)
看起来ClassLoader.getResourceAsStream(String name)
会返回null
,然后会导致Properties.load
抛出NullPointerException
。
以下是文档摘录:
URL getResource(String name)
:查找具有给定名称的资源。资源是一些数据(图像,音频,文本等),可以通过类代码以独立于代码位置的方式访问。资源的名称是
'/'
- 用于标识资源的分隔路径名。返回:用于阅读资源的
URL
对象,或{:1}}如果:
- 无法找到资源,或
- 调用者没有足够的权限来获取资源。
getResource
答案 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)
我遇到了同样的问题,我通过以下方式解决了问题
File file = new File("resources.properties");
System.out.println(file.getAbsolutePath());
然后将“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"));
现在工作正常!