我有一个用户报告的问题我无法复制。问题是错误:
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文件)。他把它寄给了我,完整无缺。
答案 0 :(得分:1)
显然,您在IDE中运行了代码,该代码根本不使用构建的JAR文件:它使用编译步骤生成的目录层次结构。您在此处所要做的就是检查您发送的JAR文件的内容,显然不包含/version
。重现此问题的方法是在干净安装中以与客户相同的方式运行相同的JAR文件。然而,这不是你真正要求的。 解决方案是摆脱资源,并将版本信息放入JAR清单中,您不能忘记发货。
答案 1 :(得分:0)
用户声称他卸载了MacAfee防病毒软件(随PC分发)并将其替换为Avast!这解决了这个问题。不完全是一个编程答案,但我决定分享这个,以防有人面临同样的问题。