问题描述
行persistenceProperties.load(is);
在以下方法中引发nullpointerexception
. 如何解决此错误?
public void setUpPersistence(){
final Properties persistenceProperties = new Properties();
InputStream is = null;
try {
is = getClass().getClassLoader().getResourceAsStream("src/test/samples/persistence.properties");
persistenceProperties.load(is);
}catch (IOException ignored) {}
finally {
if (is != null) {try {is.close();} catch (IOException ignored) {}}
}
entityManagerFactory = Persistence.createEntityManagerFactory(
"persistence.xml", persistenceProperties);
}
我尝试通过将包含方法的类移到应用程序结构中的其他各个位置,并通过以下方式更改错误前的代码行来对此进行试验:
is = getClass().getClassLoader().getResourceAsStream("persistence.properties");
is = getClass().getClassLoader().getResourceAsStream("/persistence.properties");
is = getClass().getClassLoader().getResourceAsStream("/src/test/samples/persistence.properties");
is = getClass().getClassLoader().getResourceAsStream("other/paths/after/moving/persistence.properties");
但是每次调用该方法时仍然会引发错误.
这是Eclipse项目的目录结构的打印屏幕.包含该方法的类称为TestFunctions.java
,并且显示persistence.properties
的位置:
****
根据下面的反馈,我将方法更改为:
public void setUpPersistence(){
final Properties persistenceProperties = new Properties();
InputStream is = null;
try {
is = getClass().getClassLoader().getResourceAsStream("persistence.properties");
persistenceProperties.load(is);
}catch (IOException i) {i.printStackTrace();}
finally {
if (is != null) {try {is.close();} catch (IOException ignored) {}}
}
entityManagerFactory = Persistence.createEntityManagerFactory(
"persistence.xml", persistenceProperties);
}
我还将mainTest.TestFunctions.java移到了src/test/java
.在一起,所有这些都会导致以下新的堆栈跟踪:
Exception in thread "main" java.lang.NoClassDefFoundError: maintest/TestFunctions
at maintest.Main.main(Main.java:7)
Caused by: java.lang.ClassNotFoundException: maintest.TestFunctions
at java.net.URLClassLoader$1.run(URLClassLoader.java:202)
at java.security.AccessController.doPrivileged(Native Method)
at java.net.URLClassLoader.findClass(URLClassLoader.java:190)
at java.lang.ClassLoader.loadClass(ClassLoader.java:306)
at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:301)
at java.lang.ClassLoader.loadClass(ClassLoader.java:247)
... 1 more
简短答案:将persistence.properties
移至src/main/resources
,在src/main/java
中同时包含Main.java
和TestFunctions.java
,并使用
getClass().getClassLoader().getResourceAsStream("persistence.properties");
加载属性文件.
答案很长的解释:
正如其他人所暗示的-在Maven项目结构中,您(通常)有两个目录树:/src/main
和/src/test
.总体意图是,任何真实"代码,资源等都应放在/src/main
中,而仅测试的项目应放在/src/test
中.在编译和运行时,test
树中的项目通常可以访问main
树中的项目,因为它们旨在测试main中的内容.但是,main
树中的项目通常无法访问test
树中的项目,因为根据测试材料来获取生产"代码通常是一个坏主意.因此,由于Main.java
依赖于TestFunctions.java
,而TestFunctions.java
依赖于persistence.properties
,因此,如果Main位于src/main
中,则TestFunctions
和persistence.properties
都必须同时位于.The line persistenceProperties.load(is);
is throwing a nullpointerexception
in the following method. How can I resolve this error?
public void setUpPersistence(){
final Properties persistenceProperties = new Properties();
InputStream is = null;
try {
is = getClass().getClassLoader().getResourceAsStream("src/test/samples/persistence.properties");
persistenceProperties.load(is);
}catch (IOException ignored) {}
finally {
if (is != null) {try {is.close();} catch (IOException ignored) {}}
}
entityManagerFactory = Persistence.createEntityManagerFactory(
"persistence.xml", persistenceProperties);
}
I have tried to experiment with this by moving the class that contains the method to various other locations within the application structure, and also by changing the line of code preceding the error in the following ways:
is = getClass().getClassLoader().getResourceAsStream("persistence.properties");
is = getClass().getClassLoader().getResourceAsStream("/persistence.properties");
is = getClass().getClassLoader().getResourceAsStream("/src/test/samples/persistence.properties");
is = getClass().getClassLoader().getResourceAsStream("other/paths/after/moving/persistence.properties");
But the error is still thrown every time the method is called.
Here is a printscreen of the directory structure of the eclipse project. The class containing the method is called TestFunctions.java
, and the location of persistence.properties
is shown:
**EDIT: **
As per feedback below, I changed the method to:
public void setUpPersistence(){
final Properties persistenceProperties = new Properties();
InputStream is = null;
try {
is = getClass().getClassLoader().getResourceAsStream("persistence.properties");
persistenceProperties.load(is);
}catch (IOException i) {i.printStackTrace();}
finally {
if (is != null) {try {is.close();} catch (IOException ignored) {}}
}
entityManagerFactory = Persistence.createEntityManagerFactory(
"persistence.xml", persistenceProperties);
}
I also moved mainTest.TestFunctions.java to src/test/java
. Together, these all cause the following new stack trace:
Exception in thread "main" java.lang.NoClassDefFoundError: maintest/TestFunctions
at maintest.Main.main(Main.java:7)
Caused by: java.lang.ClassNotFoundException: maintest.TestFunctions
at java.net.URLClassLoader$1.run(URLClassLoader.java:202)
at java.security.AccessController.doPrivileged(Native Method)
at java.net.URLClassLoader.findClass(URLClassLoader.java:190)
at java.lang.ClassLoader.loadClass(ClassLoader.java:306)
at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:301)
at java.lang.ClassLoader.loadClass(ClassLoader.java:247)
... 1 more
Short answer:Move persistence.properties
to src/main/resources
, have both Main.java
and TestFunctions.java
in src/main/java
, and use
getClass().getClassLoader().getResourceAsStream("persistence.properties");
to load the properties file.
Long answer with an explanation:
As others have hinted at - in a Maven project structure, you (typically) have two directory trees: /src/main
and /src/test
. The general intent is that any "real" code, resources, etc should go in /src/main
, and items that are test-only should go in /src/test
. When compiled and run, items in the test
tree generally have access to items in the main
tree, since they're intended to test the stuff in main; items in the main
tree, however, do not typically have access to items in the test
tree, since it's generally a bad idea to have your "production" code depending on test stuff. So, since Main.java
depends on TestFunctions.java
, and TestFunctions.java
depends on persistence.properties
, if Main is in src/main
then both TestFunctions
and persistence.properties
need to be as well.
这篇关于InputStream.getResourceAsStream()提供空指针异常的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持!