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 targetdirectory.

感谢您的宝贵时间!

这将取决于“/assistant.csv”文件的位置,如果找不到,您将获得 NPE。该路径将取决于您的 class 位置,因为您正在调用 CsvParser.class.getResourceAsStream..

终于找到错误了。我在两个 classes(CsvParserTestCsvParser)旁边添加了 assistant.csv。但在这两种情况下,该文件都不会添加到目标目录中。

它在 TestCsvParser 中工作的原因是 ../test/resource/ 目录中的附加 assistant.csv。事实上,我描述的两个条件忽略了这个事实,因此你无法完全重建我的错误。我很抱歉。

要有一个工作示例,maintest 的资源文件必须放在 resource 文件夹中,而不是放在 class.[=20 旁边=]

感谢您的帮助,尤其是 Kalaiselvan A