从命令行运行JAR而不是从IDE运行JAR会导致NullPointerException的原因是什么?

时间:2009-07-16 12:19:45

标签: java jar nullpointerexception

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

我从源代码编译的第三方JAR抛出了有问题的NullPointerException。但是,我怀疑这是问题 - 当我在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中的类。

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

6 个答案:

答案 0 :(得分:1)

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

当然,如果你告诉我们堆栈跟踪的其余部分而不仅仅是它是一个NPE,我们会更少猜测...而且你有源的事实意味着你应该能够完全

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

答案 1 :(得分:1)

在后一种情况下,看起来更像DBF文件路径无法正确解析。在Eclipse中运行类文件的文件路径与运行批处理文件的位置大不相同。 (不是类路径,而是从你做java -jar的物理路径...,比如说,D:\ my \ app \ bin)Eclipse运行的路径是在运行配置 - &gt;参数选项卡 - &gt;工作目录字段。

答案 2 :(得分:1)

您应该学习如何将调试器附加到独立程序,这样您就可以将IDE与源连接到此运行程序。我同意Jon Skeet的说法,这很可能是一个找不到的文件 - 尝试直接更改你的运行配置的当前状态,看看它是否会中断。

答案 3 :(得分:0)

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

答案 4 :(得分:0)

尝试在JDK而不是JRE上运行它,这样你就可以看到你在哪一行接收NullPointerException,并通过查看源代码来了解该做什么。

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

答案 5 :(得分:0)

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