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.它怎么还能发生?错误报告可以被认为是值得信赖的.
解决方法
尚未提出的一个问题是:问题什么时候开始出现?经过特定的软件更新或突然出现?您可能无法追踪它最初发生时的确切日期,但是如果它可以与时间相关联,那么您作为软件提供的任何内容都可能会发生更改(例如,您是否捆绑了JRE?)导致问题.然后,您将有条不紊地将已知的错误前版本与第一个错误清单发布之间的更改进行区分.
如果它突然出现,最有可能的问题来源(据我所知,你所披露的内容)隐藏在软件执行环境的某个地方(可能不在你的直接控制之下).它可能是JRE本身,相关的库或系统服务,甚至可能是硬件和软件的特定组合(信不信由你,有时显然甚至工作站的BIOS都会产生巨大的影响:https://www.daniweb.com/hardware-and-software/microsoft-windows/windows-vista-and-windows-7-8/threads/271699).
为了提高实际解决问题原因的机会,您需要收集错误实际出现的环境的信息,并尽可能地(至少JRE版本,32/64位,操作系统;最好安装补丁,cpu型号;最好包括掩模设置修订版,主板型号;最好包括BIOS版本和主板版本).不要忘记确切的版本或导致问题的软件.如果您的用户群具有非常同质的环境(例如,在大型公司中只购买了几个工作站型号,可能全部来自同一供应商),那么与用户群非常异质(例如,许多独立客户使用)相比,这些小细节更有意义.完全不同的配置).
给定足够的数据模式应该出现(所有错误报告都有共同点,例如特定的JRE;或者一组JRE版本,特定的工作站模型等).
如果可能,您的用户可以与您合作(故意改变遇到问题的机器/用户的环境)来测试候选人.这可能涉及安装JDK以获取更多错误上下文,更改VM设置等.