class.getResourceAsStream在用户的机器上返回null,如何重现?

时间:2016-08-22 11:20:11

标签: java

我有一个用户报告的问题我无法复制。问题是错误:

Exception in thread "main" java.lang.NullPointerException: source at java.util.Objects.requireNonNull(Unknown Source) at java.util.Scanner.(Unknown Source) at cz.autoclient.Main.getVersion(Main.java:86) at cz.autoclient.Main.(Main.java:76) at cz.autoclient.Main.main(Main.java:262)

在此代码中:

   private VersionId VERSION = new VersionId("0.0-error");
   public final VersionId getVersion() {
     if(VERSION.affix.equals("error")) {
       InputStream in = Main.class.getResourceAsStream("/version");
       Scanner sc = new Scanner(in, "UTF-8"); // LINE 86
       VERSION = new VersionId(sc.useDelimiter("\\A").next());
     }
     return VERSION;
   }

我在这里做的是解析包含应用程序版本信息的内部资源(包括版本作为变量,结果非常不切实际)。

版本文件可能如下所示:

v3.5-beta

错误似乎是由资源"/version"无法访问引起的。这个错误似乎只发生在用户身上,所以我需要帮助,为什么它甚至可能发生。用户的Java版本是:

java version "1.8.0_101"
Java(TM) SE Runtime Environment (build 1.8.0_101-b13)
Java HotSpot(TM) 64-Bit Server VM (build 25.101-b13, mixed mode)

这是完整的Main.java (specific commit)。该应用程序以jar文件的形式分发。 version文件位于jar文件的根目录中。

如果我不清楚问题是当我运行相同的版本(从发布网站下载,而不是重建)时,我没有遇到问题。我要求用户验证文件是否存在(通过解压缩jar文件)。他把它寄给了我,完整无缺

2 个答案:

答案 0 :(得分:1)

显然,您在IDE中运行了代码,该代码根本不使用构建的JAR文件:它使用编译步骤生成的目录层次结构。您在此处所要做的就是检查您发送的JAR文件的内容,显然不包含/version。重现此问题的方法是在干净安装中以与客户相同的方式运行相同的JAR文件。然而,这不是你真正要求的。 解决方案摆脱资源,并将版本信息放入JAR清单中,您不能忘记发货。

答案 1 :(得分:0)

用户声称他卸载了MacAfee防病毒软件(随PC分发)并将其替换为Avast!这解决了这个问题。不完全是一个编程答案,但我决定分享这个,以防有人面临同样的问题。