Как стать автором
Обновить
890.79
OTUS
Цифровые навыки от ведущих экспертов

Наиболее частые исключения Java

Время на прочтение4 мин
Количество просмотров4.9K
Автор оригинала: Andras Horvath

На платформе Samebug мы собрали обширную коллекцию сообщений о сбоях, опубликованных на различных веб-ресурсах. Каждое сообщение представляет собой трассировку стека с указанием веб-страницы, на которой оно было обнаружено. Мы сгруппировали эти сбои по ряду критериев: тип исключения, программный компонент, сгенерировавший исключение, основные ресурсы, на которых были опубликованы сообщения, и т. д. Мы также выявили типовые шаблоны ошибок, часто доставляющих проблемы разработчикам. Под шаблоном ошибки мы понимаем общую часть, совпадающую в нескольких разных трассировках стека.

Затем мы начали анализировать данные, чтобы получить представление о наиболее часто возникающих исключениях в Java. Мы рассмотрели три метрики: количество собранных сообщений о сбоях, количество обнаруженных веб-страниц с относящимися к данному исключению трассировками стека и количество идентифицированных нашим алгоритмом шаблонов ошибок. Такой анализ был необходим, поскольку целью проекта Samebug является создание платформы, помогающей легко устранять баги. Чтобы платформа работала эффективно, в первую очередь нужно искать пути устранения тех багов, которые возникают наиболее часто. Вот что мы выяснили в результате анализа:

Посмотрев на данные о количестве сбоев, можно увидеть, что наиболее распространенной ошибкой является исключение NullPointerException (что неудивительно). Также оно чаще всего встречается на веб-страницах, где упоминались те или иные исключения:

Разница между первой и второй диаграммами объясняется тем, что на одной веб-странице может содержаться несколько трассировок стека (например, один запрос (issue) на GitHub может охватывать несколько трассировок). Можно заметить, что порядок типов исключений на диаграммах несколько отличается: например, для IllegalArgumentException и IllegalStateException метрика упоминания в сетевых обсуждениях оказывается выше, чем метрика, характеризующая количество сбоев.

На третьей диаграмме мы ранжировали типы исключений в зависимости от того, сколько с ними связано шаблонов ошибок. Видно, что рейтинг некоторых исключений оказывается ниже, чем на первой диаграмме. Это означает, что с ними связано меньше шаблонов, однако эти шаблоны в среднем чаще обнаруживаются в сообщениях о сбоях.

Наиболее примечательным из таких исключений является ClassNotFoundException. На самом деле, еще при работе над группировкой шаблонов ошибок мы заметили, что в различных сообщениях о сбоях, опубликованных широким кругом разработчиков, наиболее часто встречались шаблоны, связанные с ClassNotFoundException. Мы уже писали о способах обработки исключения ClassNotFoundException, поэтому сейчас сравним его с NullPointerException, представив для каждого из этих двух исключений распределение по количеству сообщений о сбоях и количеству выявленных шаблонов ошибок. Мы увидели, что многие из шаблонов ошибок, связанных с ClassNotFoundException, очень часто обнаруживаются в нашей базе сбоев. Между тем в случае NullPointerException шаблонов ошибок гораздо больше, но в среднем они соответствуют значительно меньшему числу сообщений о сбоях. Мы проиллюстрировали эту разницу на нижеприведенной диаграмме (обратите внимание, что используется логарифмическая шкала).

В случае NullPointerException выявлено более 30 тысяч шаблонов, каждый из которых связан менее чем с десятью сбоями, и 65 шаблонов с 100–999 связанными сбоями. При этом в случае ClassNotFoundException выявлено лишь 10 тысяч шаблонов менее чем с десятью связанными сбоями, но найдено гораздо больше шаблонов с более чем сотней сбоев. Есть даже шаблоны, насчитывающие больше тысячи сбоев, и один шаблон, с которым связано более десяти тысяч сбоев.

Такой результат может многих удивить, поэтому давайте выясним причину.

Вызовы в коде, которые приводят к сбою с NullPointerException, довольно разнообразны, потому что они относятся к множеству разных библиотек и исключение возникает сразу, как только кто-то сделает ошибку. В то же время ClassNotFoundException генерируется стандартным механизмом JVM и, следовательно, порождает множество трассировок стека с одинаковым шаблоном ошибки.

Можно было подумать, что NullPointerException и ClassNotFoundException являются настолько простыми ошибками, что каждый разработчик знает, как их устранять. Однако частота их упоминания на форумах противоречит этому предположению, а значит, если написать руководство по их обработке, оно безусловно будет полезно многим разработчикам. Для NullPointerException написать небольшой набор общих решений, подходящих для большинства случаев, было бы сложно, так как в каждой библиотеке проблема возникает по разным причинам. А вот для ClassNotFoundException существует несколько общих шаблонов ошибок, с которыми сталкиваются многие разработчики. Конечно, для разных сред и фреймворков понадобятся конкретные решения, но общие методы, на которые мы дали ссылку выше, все же применимы.

Проведенный анализ дает нам возможность рационально выбрать шаблоны ошибок, для которых следует в первую очередь разработать руководства. Мы пришли к выводу, что в этом смысле шаблоны ошибок ClassNotFoundException должны быть приоритетнее, несмотря на то что с исключением NullPointerException связано больше сбоев.

В настоящее время мы ищем экспертов для написания коротких руководств по обработке шаблонов ошибок, возникающих в следующих программных средах: Neo4J, Java Runtime, MySQL, Google Guava, JUnit, Tomcat, Hibernate, Spring и Android. Если вам интересно такое сотрудничество, напишите нам по адресу hello@samebug.io.


Материал подготовлен в рамках курса «Подготовка к сертификации Oracle Java Programmer (OCAJP)».

Всех желающих приглашаем на открытый урок «Конструкторы и блоки инициализации». На бесплатном вебинаре мы:
- Разберём конструктор на запчасти;
- Определим финалистов (финальные переменные);
- Наведём порядок (инициализации).
>> РЕГИСТРАЦИЯ

Теги:
Хабы:
Всего голосов 6: ↑4 и ↓2+2
Комментарии3

Публикации

Информация

Сайт
otus.ru
Дата регистрации
Дата основания
Численность
101–200 человек
Местоположение
Россия
Представитель
OTUS