Java NullPointerException真的依赖于类的位置吗?
我在Maven项目中有两个类,它们包含相同的代码(除了名称)。代码稍后将基于csv文件使用Javassist创建一个新类 第一个Java NullPointerException真的依赖于类的位置吗?,java,maven,javassist,Java,Maven,Javassist,我在Maven项目中有两个类,它们包含相同的代码(除了名称)。代码稍后将基于csv文件使用Javassist创建一个新类 第一个CsvParser放在src/main/java/CsvParser包中。第二个TestCsvParser放在src/test/java/csvParser包中。在这两个包中,放置了相同的文件assistant.csv 当我从main目录(CsvParser)运行一个时,我会得到一个java.lang.NullPointerException,但是当我运行TestCsv
CsvParser
放在src/main/java/CsvParser
包中。第二个TestCsvParser
放在src/test/java/csvParser
包中。在这两个包中,放置了相同的文件assistant.csv
当我从main
目录(CsvParser
)运行一个时,我会得到一个java.lang.NullPointerException
,但是当我运行TestCsvParser
时,放在test
目录中,同样的代码工作正常
为什么会这样?(或者我只是看不到什么?;)
CsvParser
:
package csvParser;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
public class CsvParser {
public static void main(String[] args) throws IOException
{
createClass("/assistant.csv");
}
/**
* Create a class from a csv-file.
*/
private static void createClass(String input) throws IOException {
try(BufferedReader stream = new BufferedReader(new InputStreamReader(
CsvParser.class.getResourceAsStream(input))))
{
// Create class based on csv-file.
}
}
}
TestCsvParser
:
package csvParser;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
public class TestCsvParser {
public static void main(String[] args) throws IOException
{
createClass("/assistant.csv");
}
/**
* Create a class from a csv-file.
*/
private static void createClass(String input) throws IOException {
try(BufferedReader stream = new BufferedReader(new InputStreamReader(
TestCsvParser.class.getResourceAsStream(input))))
{
// Create class based on csv-file.
}
}
}
例外
Exception in thread "main" java.lang.NullPointerException
at java.io.Reader.<init>(Reader.java:78)
at java.io.InputStreamReader.<init>(InputStreamReader.java:72)
at csvParser.CsvParser.createClass(CsvParser.java:19)
at csvParser.CsvParser.main(CsvParser.java:11)
线程“main”java.lang.NullPointerException中的异常
在java.io.Reader上。(Reader.java:78)
位于java.io.InputStreamReader。(InputStreamReader.java:72)
位于csvParser.csvParser.createClass(csvParser.java:19)
位于csvParser.csvParser.main(csvParser.java:11)
我相信这个问题不是像什么是NullPointerException
这样的问题的重复,因为:
NullPointerException
根据类的位置和引用的资源发生。所以更多的是关于目录结构和Maventarget
directory
谢谢你的时间 这取决于“/assistant.csv”文件的位置,如果找不到,您将获得NPE。路径将取决于您的类位置,因为您正在调用
CsvParser.class.getResourceAsStream..
最后我发现了错误。我在两个类(CsvParser
和TestCsvParser
)旁边添加了assistant.csv
)。但在这两种情况下,该文件都不会添加到目标目录
它在TestCsvParser
中工作的原因是在./test/resource/
目录中增加了一个assistant.csv
。事实上,我描述的两个条件忽略了这一事实,因此你无法完全重建我的错误。对此我很抱歉
要获得一个工作示例,main
和test
的资源文件必须放在resource
文件夹中,而不是类旁边
特别感谢您的帮助。也请显示例外情况检查助手.csv存在于您的maven Project资源文件夹中可能是重复的,可能是我误解了您的意思,但该文件位于两个目录中。两次都在教室旁边。那么NPE在哪里?我想这是在寻找输入资源。。。如果没有,你在哪一行看到NPE?@SoS要验证我说的话,试着打印这个
CsvParser.class.getResource(“/assistant.csv”)
您将知道它在哪里为null。CsvParser.class.getResource(“/assistant.csv”)
返回null
TestCsvParser.class.getResource(“/assistant.csv”)
返回文件:/C:/Users/User/IdeaProjects/ComponentClassification/target/test classes/assistant.csv
。所以你是对的,但这并不能解释为什么它是这样的;)。这与此非常相似,因为当您运行非测试类时,您的assistant.csv可能不会被复制到目标/类。