Java 当从命令行而不是IDE运行JAR时,什么会导致NullPointerException?

Java 当从命令行而不是IDE运行JAR时,什么会导致NullPointerException?,java,jar,nullpointerexception,Java,Jar,Nullpointerexception,我在Eclipse中有一个项目。当我从Eclipse内部运行它时,一切正常。但是,当我运行Ant构建脚本并从命令行或使用批处理脚本执行JAR时,我会得到一个NullPointerException 所讨论的NullPointerException是从我从源代码编译的第三方JAR中抛出的。但是,我怀疑这是问题所在——当我在Eclipse中执行它时,它就工作了 这可能是什么原因造成的?我该如何隔离问题并加以纠正 以下是我所能展示的堆栈跟踪: java.lang.NullPointerExceptio

我在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)
java.lang.NullPointerException
位于java.io.FilterInputStream.read(未知源)
位于java.io.BufferedInputStream.fill(未知源)
位于java.io.BufferedInputStream.read(未知源)
位于java.io.DataInputStream.readUnsignedByte(未知源)
位于com.jhlabs.dbf.DBFFile.readHeader(DBFFile.java:129)
位于com.jhlabs.dbf.DBFFile(DBFFile.java:76)
在com.jhlabs.map.shapefile.shapefile.(shapefile.java:102)
位于com.jhlabs.map.layer.ShapefileLayer。(ShapefileLayer.java:62)
我检查了类路径——第三方JAR确实在类路径上。然而,我预料到了这一点,因为如果不是的话,我很可能会得到NoClassDefFoundException,并且我尝试利用JAR中的类


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

一个猜测:它试图使用
classloader.getResourceAsStream()
或类似的方法查找资源,但在jar中找不到它

当然,如果你告诉我们堆栈跟踪的其余部分,而不仅仅是它是一个NPE,我们的猜测就会少很多。。。事实上,你已经得到了来源,这意味着你应该能够准确地找出哪里出了问题


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

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

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


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

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

在后一种情况下,DBF文件路径的解析似乎不正确。在Eclipse中运行类文件的文件路径与运行批处理文件的文件路径大不相同。(不是类路径,而是执行java-jar的物理路径…,比如D:\my\app\bin)Eclipse运行的路径位于运行配置->参数选项卡->工作目录字段中。

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

您是否将第三方JAR放在构建路径中?--Woops,点击Add Comment太快了,您是否将其与JAR打包?我无法共享大部分堆栈跟踪,但我认为你可能走对了方向。我现在正在研究它,但我确实知道文件在JAR中,但是可能找不到正确的文件。请原谅我的noobishness,但是我如何指定在JDK上运行JAR?我以前从未这样做过,但我确实认为这可能会对我有所帮助。特别是因为我不知道什么是空值,知道它将帮助我解决问题。