代码之家  ›  专栏  ›  技术社区  ›  So S

NullPointerException真的取决于类的位置吗?

  •  0
  • So S  · 技术社区  · 7 年前

    我在Maven项目中有两个类,它们包含相同的代码(除了名称)。代码稍后将基于csv文件使用Javassist创建一个新类。

    第一个 CsvParser src/main/java/csvParser 包裹第二个 TestCsvParser 放置在 src/test/java/csvParser 包裹在两个包中,都是同一个文件 assistant.csv 已放置。

    当我从 main CsvParser公司 java.lang.NullPointerException 但是当我跑步的时候 测试CSVParser ,放置在 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.
            }
        }
    }
    

    测试CSVParser :

    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 target 目录

    谢谢你的时间!

    2 回复  |  直到 7 年前
        1
  •  1
  •   So S    7 年前

    最后我发现了错误。我添加了 assistant.csv 在这两个班级旁边( CsvParser TestCsvParser ). 但在这两种情况下,该文件都不会添加到目标目录。

    测试CSVParser 是额外的 ../test/resource/ 目录事实上,我描述的两个条件忽略了这个事实,因此你无法完全重建我的错误。对此我很抱歉。

    有一个工作示例,资源文件 main test 必须放置在 resource 文件夹,而不是类旁边。

    Kalaiselvan A .

        2
  •  0
  •   Optional    7 年前

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