我刚刚收到了以下针对我们软件的错误报告:
java.lang.NullPointerException
at java.util.Arrays.equals(Unknown Source)
at our.app.OurMain(OurMain.java:13)
Windows上的JRE 1.7.0_45会发生这种情况,相应的源代码Arrays.equals
为:
public static boolean equals(byte[] a, byte[] a2) {
if (a==a2)
return true;
if (a==null || a2==null)
return false;
int length = a.length;
if (a2.length != length)
return false;
for (int i=0; i<length; i++)
if (a[i] != a2[i])
return false;
return true;
}
调用代码是:
final byte[] b1 = ... // populate array
final byte[] b2 = ... // populate array
final boolean equal = Arrays.equals(b1, b2);
显然没有办法在这里提出NullPointerException
。它怎么还能发生?错误报告可以被认为是值得信赖的。
答案 0 :(得分:1)
这不是一个答案,但因为评论太长了......
尚未被问到的一个问题是:问题什么时候开始出现?经过您的软件的具体更新或突然出现?您可能无法追踪它第一次出现时的确切日期,但是如果它可以与时间相关联,那么随着软件进行更改(例如,您是否捆绑了JRE),它可能会交付 ?)导致问题。然后,您将有条不紊地区分已知的错误前版本与第一个错误清单发布之间的更改。
如果它出现了问题,最有可能的问题来源(据我所知,你所披露的内容)隐藏在软件执行环境的某个地方(可能不在你的直接下)控制)。它可能是JRE本身,相关的库或系统服务,甚至可能是硬件和软件的特定组合(信不信由你,有时甚至显然甚至工作站的BIOS都会产生巨大的影响:https://www.daniweb.com/hardware-and-software/microsoft-windows/windows-vista-and-windows-7-8/threads/271699)。< / p>
为了提高实际解决问题原因的机会,您需要收集错误实际出现的环境信息,并尽可能地(至少JRE版本,32/64位, OS;最好安装补丁,CPU型号;最好包括掩模设置修订版,主板型号;最好包括BIOS版本和主板版本)。不要忘记确切的版本或导致问题的软件。如果您的用户群具有非常同质的环境(例如,在大型公司中只购买了几个工作站型号,可能全部来自同一供应商),那么与用户群非常异质(例如,许多独立客户使用)相比,这些小细节更有意义。完全不同的配置)。
如果有足够的数据,应该出现一种模式(所有错误报告都有共同点,例如特定的JRE;或者一组JRE版本,特定的工作站模型等)。
如果可能,您的用户可以与您合作(故意改变遇到问题的机器/用户的环境)来测试候选人。这可能涉及安装JDK以获取更多错误上下文,更改VM设置等。
只是粗略的概述,但如果没有快速解决方案,从长远来看,有条理的方法最有可能产生解决方案。
答案 1 :(得分:0)
如果您的阵列实际上是&#34; java.lang.Byte
&#34; array,并且将null作为其中一个值,因此在取消装箱(a[i] != a2[i]
)时会出现此异常。
答案 2 :(得分:0)
您可以使用javap检查字节码指令。或者是逆向工程工具。
进行单元测试:
以上区分了阵列或数组项目上的NPE。
我非常模糊的猜测:您正在将byte[]
与(Object) Byte[]
(不是byte[]
!)进行比较,而当Byte [i]为null时,空指针异常也将被抛出隐含byteValue()
。
我无法立即看到如何调用该错误。也许还有另一个等于?不在byte[]
?
答案 3 :(得分:-1)
我发现java.util.Arrays.equals(未知来源)可疑。我原本期望JRE / SDK的rt.jar包含行号信息。 所以,也许有人在该系统上安装了一些其他JDK,可能是适用于嵌入式设备的东西,或其他一些实验性JDK或类似东西,这些东西会导致您使用与以前不同的JRE。