NullPointerException 是否真的取决于 class 的位置?
Does the NullPointerException really depend on the location of the class?
我在一个 Maven 项目中有两个 classes,它们包含相同的代码(除了它们的名称)。该代码稍后将使用基于 csv 文件的 Javassist 创建一个新的 class。
第一个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)
我认为这个问题与 What is a NullPointerException
之类的问题不重复,因为:
NullPointerException
根据 class 的位置和引用的资源发生。所以更多的是关于目录结构和 Mavens target
directory.
感谢您的宝贵时间!
这将取决于“/assistant.csv”文件的位置,如果找不到,您将获得 NPE。该路径将取决于您的 class 位置,因为您正在调用 CsvParser.class.getResourceAsStream..
终于找到错误了。我在两个 classes(CsvParser
和 TestCsvParser
)旁边添加了 assistant.csv
。但在这两种情况下,该文件都不会添加到目标目录中。
它在 TestCsvParser
中工作的原因是 ../test/resource/
目录中的附加 assistant.csv
。事实上,我描述的两个条件忽略了这个事实,因此你无法完全重建我的错误。我很抱歉。
要有一个工作示例,main
和 test
的资源文件必须放在 resource
文件夹中,而不是放在 class.[=20 旁边=]
感谢您的帮助,尤其是 Kalaiselvan A。
我在一个 Maven 项目中有两个 classes,它们包含相同的代码(除了它们的名称)。该代码稍后将使用基于 csv 文件的 Javassist 创建一个新的 class。
第一个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)
我认为这个问题与 What is a NullPointerException
之类的问题不重复,因为:
NullPointerException
根据 class 的位置和引用的资源发生。所以更多的是关于目录结构和 Mavens target
directory.
感谢您的宝贵时间!
这将取决于“/assistant.csv”文件的位置,如果找不到,您将获得 NPE。该路径将取决于您的 class 位置,因为您正在调用 CsvParser.class.getResourceAsStream..
终于找到错误了。我在两个 classes(CsvParser
和 TestCsvParser
)旁边添加了 assistant.csv
。但在这两种情况下,该文件都不会添加到目标目录中。
它在 TestCsvParser
中工作的原因是 ../test/resource/
目录中的附加 assistant.csv
。事实上,我描述的两个条件忽略了这个事实,因此你无法完全重建我的错误。我很抱歉。
要有一个工作示例,main
和 test
的资源文件必须放在 resource
文件夹中,而不是放在 class.[=20 旁边=]
感谢您的帮助,尤其是 Kalaiselvan A。