哪些Java异常最常见?

Samebug有大量来自网络的崩溃:带有网页的堆栈跟踪,我们找到了它,附加了。我们根据许多标准对这些崩溃进行了分组:异常类型,抛出异常的软件组件,我们找到它们的主要来源等。我们还确定了常见的错误模式(堆栈跟踪中的几个部分在几个不同的堆栈跟踪)这给开发人员带来了很多麻烦。

错误模式是不同堆栈跟踪的常见元素

然后,我们开始分析数据,以获得对最常见的Java异常的一些见解。我们查看了3个测量值:收集的崩溃次数,与异常相关的堆栈跟踪的网页数量以及我们的算法识别的错误模式数量。自从在Samebug,我们正致力于创建一个有助于轻松修复错误的平台,这种分析至关重要。我们解决的问题是绝对必须知道哪些问题最常发生,以便我们能够有效。以下是我们从分析中发现的内容:

在查看崩溃次数时,我们可以看到,毫不奇怪,NullPointerException是迄今为止最常见的错误。它也可以在异常类型中的最大数量的网页上找到,如图2所示:

这与前一个之间的区别在于网页可以包含几个不同的堆栈跟踪(例如,多个堆栈跟踪粘贴到单个GitHub问题中)。我们可以看到异常类型的顺序存在一些差异:例如,与仅在崩溃次数中测量的重要性相比,IllegalArgumentException和IllegalStateException在Web上的讨论中具有更显着的存在性。

在图3中,我们根据与它们相关的错误模式的数量对异常类型进行了排序。可以看出,一些异常类型的排名低于第一个图。这意味着较少的模式连接到它们,但这些模式平均有更多的崩溃。

最引人注目的类型是ClassNotFoundException。实际上,当我们处理错误模式分组时,我们已经注意到,在不同崩溃中最常见的模式,换句话说,由众多不同的开发人员共享,与ClassNotFoundException相关。我们已经写过如何处理ClassNotFoundExceptions之前让我们将其崩溃/错误模式分布与NullPointerException的分布进行比较。我们发现许多ClassNotFoundException模式在我们的数据库中都有大量的崩溃。同时在NullPointerException的情况下,有更多的错误模式,但这些错误模式平均收集的崩溃数量明显减少。我们在下面的图表中说明了这一点(请注意,这些数字是对数刻度)。

在NullPointerException的情况下,有超过30,000个模式,每个模式有少于10个连接崩溃和65个模式,100-999崩溃。在ClassNotFoundException的情况下,只有10000个模式,相关崩溃少于10个,但与NullPointerExceptions相比,还有更多模式,崩溃超过100个。甚至有1000多个连接崩溃的模式,一个模式有超过10000个连接崩溃。

这个结果可能让许多人感到意外,所以让我们找出背后的原因:

导致NullPointerException崩溃的代码中的调用非常分散,因为它们来自许多不同的库并在出错时立即生效,而ClassNotFoundException是由JVM的标准机制生成的,因此导致许多堆栈跟踪具有相同的错误模式。

可以认为NullPointerException和ClassNotFoundException都是错误的,所以每个开发人员都知道如何轻松地解决它们,但是它们在论坛上的频繁出现与这个假设相矛盾,所以编写如何处理它们的指南对很多开发人员来说肯定是有帮助的。在NullPointerException的情况下,很难编写一些通用解决方案,因为每个库中的问题都不同。在ClassNotFoundException的情况下,许多开发人员都会遇到一些常见的错误模式。当然,您可以使用针对不同环境或框架的特定解决方案,但提供的一般解决方案仍然有意义。

我们进行了这种分析,因此我们可以巧妙地选择开始的模式。我们得出的结论是,即使NullPointerException存在更多崩溃,ClassNotFoundException错误模式也应该首先出现。