Поделитесь недостатком в реализации исключений Java, о котором вы, вероятно, не знаете

предисловие

Хорошо известная точка знаний в Java - это захват исключений, комбинация try...catch...finally, но многие люди не знают, что в Java есть дефект или недостаток реализации исключений.

Здесь я продемонстрирую вам эффект на очень простом эксперименте, надеюсь, вам будет интересно.

моделирование

1. Пользовательские исключения

Здесь мы сначала пишем пользовательское бизнес-исключение, которое специально используется для генерации.

вставьте сюда описание изображения

2. Исключение моделирования

Затем мы пишем тестовый метод для перехвата и выдачи исключения нулевого указателя.

вставьте сюда описание изображения

Посмотрите на эффект, хорошо, без проблем.

вставьте сюда описание изображения

Далее, давайте добавим, наконец, чтобы увидеть.

вставьте сюда описание изображения

Посмотрите на эффект, ОК не проблема.

вставьте сюда описание изображения

Затем мы делаем это, вызывая исключение finally.

вставьте сюда описание изображения

Глядя на эффект, я обнаружил, что исключение catch было покрыто.

вставьте сюда описание изображения

Хотя такого рода сцены очень специфичны, на самом деле это ложка дегтя в реализации исключений в Java, потому что исключения никогда не следует игнорировать как признак программных ошибок, но в этом сценарии исключения действительно теряются.

Далее, давайте проверим другую ситуацию, используем return в finally и посмотрим, что произойдет.

вставьте сюда описание изображения

Глядя на эффект, я обнаружил, что пойманное в catch исключение просто исчезло, как будто и не приходило.

вставьте сюда описание изображения

Наконец, давайте продемонстрируем еще одну необъяснимую вещь, которую вы, возможно, делали или видели на работе.

Давайте изменим этот тестовый метод и посмотрим на код.

вставьте сюда описание изображения

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

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

Тогда результат может быть следующим: вы обнаружите, что то, что поймало исключение метода запроса, которое вы умышленно бросили в начале, вообще не действует, и вы не знаете, куда оно делось. это как ни посмотри.Следующая необъяснимая аномалия,если не можешь потом вспомнить,забудь.

вставьте сюда описание изображения

причина

На самом деле это недостаток реализации Java-исключений.Исключения являются признаком программных ошибок и их нельзя игнорировать, не говоря уже о часто используемом поведении finally, которое прямо или косвенно вызывает потерю исключений.

Автор "Thinking In Java" четко указал на это исключение и считает это серьезным недостатком.是一个可能造成异常完全丢失的缺陷,而且是以一种更微妙、更难以察觉的方式在进行。

C++, с другой стороны, справляется с этим хорошо и рассматривает ситуацию, когда второе исключение генерируется до обработки первого, как серьезную программную ошибку.

Подведем итог

Зная этот недостаток, его на самом деле легко избежать.

1. Избегайте создания исключений в finally;

2. Избегайте использования return в finally;

3. В улове надо выработать полезную привычку записывать логи исключений с log.error, потому что лог обязательно запишется, по крайней мере не оставит вас без зацепок.

В конце продемонстрирую эффект от добавления логов.Пока это подвох,буду добавлять логи,так что не пропущу.

вставьте сюда описание изображения


Оригинальная статья написана вручную, напечатана одна за другой, 键盘上全是血если вы считаете, что это полезно, нажмите 赞和收藏~

Я готов делиться своим опытом работы и интересными историями.Если вам это нравится, вы можете войти на домашнюю страницу 关注一下~

Acho que você gosta

Origin blog.csdn.net/xiangyangsanren/article/details/128211436
Recomendado
Clasificación