1

我在 Eclipse 中有一个项目。当我从 Eclipse 内部运行它时,一切正常。但是,当我从命令行或使用批处理脚本运行 Ant 构建脚本并执行 JAR 时,我得到了 NullPointerException。

有问题的 NullPointerException 是从我从源代码编译的第三方 JAR 中抛出的。但是,我怀疑这就是问题所在——当我在 Eclipse 中执行它时它会起作用!

什么可能导致这种情况,我该如何隔离问题并纠正它?

这是我可以显示的尽可能多的堆栈跟踪:

java.lang.NullPointerException
        at java.io.FilterInputStream.read(Unknown Source)
        at java.io.BufferedInputStream.fill(Unknown Source)
        at java.io.BufferedInputStream.read(Unknown Source)
        at java.io.DataInputStream.readUnsignedByte(Unknown Source)
        at com.jhlabs.dbf.DBFFile.readHeader(DBFFile.java:129)
        at com.jhlabs.dbf.DBFFile.<init>(DBFFile.java:76)
        at com.jhlabs.map.shapefile.Shapefile.<init>(Shapefile.java:102)
        at com.jhlabs.map.layer.ShapefileLayer.<init>(ShapefileLayer.java:62)

我检查了类路径——第三方 JAR 确实在类路径上。但是,我预计会这样,因为如果不是,我很可能会得到 NoClassDefFoundException,并且我尝试使用 JAR 中的类。

我还检查了我使用类加载器的位置,它们不为空并且正确加载了正确的文件。

4

6 回答 6

1

一个猜测:它正在尝试使用ClassLoader.getResourceAsStream()或类似的资源,但它没有在 jar 中找到它。

当然,如果您告诉我们堆栈跟踪的其余部分而不是仅仅告诉我们它是 NPE,我们会猜得更少……而且您拥有源代码这一事实意味着您应该能够准确地计算出来哪里出错了!

编辑:是的,使用该堆栈跟踪它可能会创建一个FilterInputStream但传入一个null流进行包装。(JDK 确实应该在构造函数中抛出异常,但现在修复它为时已晚。)

于 2009-07-16T12:23:26.647 回答
1

在后一种情况下,看起来更像是 DBF 文件路径没有正确解析。在 Eclipse 中运行类文件的文件路径与运行批处理文件的位置大不相同。(不是类路径,而是您正在执行 java -jar ... 的物理路径,例如 D:\my\app\bin)Eclipse 运行的路径位于 Run Configurations -> Arguments tab ->工作目录字段。

于 2009-07-16T12:58:28.843 回答
1

您应该学习如何将调试器附加到独立程序,这样您就可以将带有源代码的 IDE 附加到这个正在运行的程序。我同意 Jon Skeet 的观点,这很可能是一个找不到的文件 - 尝试直接更改当前的运行配置,看看它是否也会中断。

于 2009-07-16T13:07:33.587 回答
0

当您从命令行运行时,您确定第 3 方 JAR 在您的路径中吗?

于 2009-07-16T12:23:51.530 回答
0

尝试在 JDK 而不是 JRE 上运行它,这样您将看到在哪一行收到 NullPointerException,并通过查看源代码找出要做什么。

另外,在启用调试信息的情况下编译它(不记得如何,请参阅 Ant javac 任务手册)。

于 2009-07-16T12:44:06.950 回答
0

我猜想你的 Eclipse 运行任务中的类路径和你手动方法中的类路径是不同的。转到 Run Configurations 对话框并检查 Eclipse 运行任务的类路径选项卡,并确保您的批处理具有相同的条目。

于 2009-07-16T12:48:22.677 回答