Когда использовать исключения в Java (пример)

Я знаю, что это было бы плохой практикой, хотя я знаю, что не смог бы объяснить почему.

int [] intArr = ...
...
try{
   int i = 0;
   while(true){
      System.out.println(intArr[i++]);
   }
}catch(ArrayIndexOutOfBoundsException e){}

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

Это кажется связанным: Предотвращение исключений по сравнению с ловлей исключений в Java

12
задан Community 23 May 2017 в 12:18
поделиться

10 ответов

Вы правы: исключения предназначены для... исключительных случаев. Использование их для управления нормальным потоком управления не только скрывает замысел кода (чего уже достаточно, чтобы дисквалифицировать его), но и работает гораздо медленнее, поскольку бросать и ловить исключения дорого.

Стандартной идиомой (в Java5 и выше) является использование цикла foreach:

for (int i : intArr) {
  System.out.println(i);
}
20
ответ дан 2 December 2019 в 03:48
поделиться

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

5
ответ дан 2 December 2019 в 03:48
поделиться

Перехват исключений - плохая практика, когда это касается исключения RuntimeException . Исключение ArrayIndexOutOfBoundsException , которое вы пытаетесь перехватить, есть.

RuntimeExceptions идентифицируют программно исправляемые проблемы, вызванные ошибками в потоке кода. Вы должны исправлять их не путем их перехвата, а путем написания правильного кода и использования операторов управления потоком, таких как if / else , while , for и т. Д.

См. Также:

5
ответ дан 2 December 2019 в 03:48
поделиться

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

for(int i = 0; i < intArr.length; ++i) {
    System.out.println(intArr[i]);
} 
1
ответ дан 2 December 2019 в 03:48
поделиться

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

1
ответ дан 2 December 2019 в 03:48
поделиться

Вы правы. Исключения не должны использоваться для обработки потока процессов.

1
ответ дан 2 December 2019 в 03:48
поделиться

Исключения для исключений в коде. Не для стандартных случаев.

Однако есть еще одна серьезная проблема с вашим кодом: он медленнее, чем был бы без использования исключения. Создание исключения, выдача исключения и перехват исключения требуют дополнительных ресурсов ЦП и ПАМЯТИ.

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

1
ответ дан 2 December 2019 в 03:48
поделиться

Как всегда, «это зависит от обстоятельств», и вы найдете много разных мнений. Вот мои

  • исключения делятся на две основные категории.
    • Вещи, которые вы можете разумно предвидеть и обрабатывать (FileNotFoundException)
    • Вещи, которые вы обычно не осуждаете, предполагая идеальный код (ArrayIndexOutOfBounds)

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

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

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

3
ответ дан 2 December 2019 в 03:48
поделиться

Только в исключительных ситуациях, например,

  • когда метод не может сделать то, что он должен сделать
  • не для контроля потока выполнения
1
ответ дан 2 December 2019 в 03:48
поделиться

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

Если это часть обычного потока программы, вы должны справиться с этим в обычном режиме.

1
ответ дан 2 December 2019 в 03:48
поделиться
Другие вопросы по тегам:

Похожие вопросы: