Я знаю, что это было бы плохой практикой, хотя я знаю, что не смог бы объяснить почему.
int [] intArr = ...
...
try{
int i = 0;
while(true){
System.out.println(intArr[i++]);
}
}catch(ArrayIndexOutOfBoundsException e){}
Я думаю, что Вы, как только предполагается, используете исключения для вещей, которых не должно происходить. Я задаю этот вопрос, потому что я думаю, что использую исключения неправильно иногда. Если Ваше программирование выполняет стандартный случай, исключения должны быть выданы?
Это кажется связанным: Предотвращение исключений по сравнению с ловлей исключений в Java
Вы правы: исключения предназначены для... исключительных случаев. Использование их для управления нормальным потоком управления не только скрывает замысел кода (чего уже достаточно, чтобы дисквалифицировать его), но и работает гораздо медленнее, поскольку бросать и ловить исключения дорого.
Стандартной идиомой (в Java5 и выше) является использование цикла foreach:
for (int i : intArr) {
System.out.println(i);
}
Это неправильно, потому что вы знаете, что в конечном итоге цикл достигнет последнего элемента intArr
, поэтому в этом нет ничего исключительного, вы на самом деле ожидаете такого поведения.
Перехват исключений - плохая практика, когда это касается исключения RuntimeException
. Исключение ArrayIndexOutOfBoundsException
, которое вы пытаетесь перехватить, есть.
RuntimeExceptions
идентифицируют программно исправляемые проблемы, вызванные ошибками в потоке кода. Вы должны исправлять их не путем их перехвата, а путем написания правильного кода и использования операторов управления потоком, таких как if / else
, while
, for
и т. Д.
Достижение конца массива не является исключением. Вы знаете длину до того, как начнете цикл, поэтому просто используйте стандартную идиому.
for(int i = 0; i < intArr.length; ++i) {
System.out.println(intArr[i]);
}
Использование исключений обычным способом обычно считается плохой практикой: если вам не нужно проводить дальнейшее лечение, вы можете зарегистрировать его.
Вы правы. Исключения не должны использоваться для обработки потока процессов.
Исключения для исключений в коде. Не для стандартных случаев.
Однако есть еще одна серьезная проблема с вашим кодом: он медленнее, чем был бы без использования исключения. Создание исключения, выдача исключения и перехват исключения требуют дополнительных ресурсов ЦП и ПАМЯТИ.
Кроме того, код становится труднее читать другим программистам, которые ожидают, что исключения будут выдаваться только в случае ошибок.
Как всегда, «это зависит от обстоятельств», и вы найдете много разных мнений. Вот мои
Обычно вы должны обрабатывать первую категорию, а не последнюю. Последнее, как правило, является ошибкой программирования.
Ваш пример относится к последнему случаю, ошибка программирования. Исключение предназначено для предоставления достоверной информации о сбое во время выполнения, а не в качестве потока управления.
Некоторые люди скажут, что первое - это отмеченные исключения, а второе - не отмеченные. Я бы с этим не согласился. Я почти всегда нахожу проверенные исключения проблемой на самом деле, так как вы почти всегда заканчиваете выполнение перехвата / переноса / повторного перехода к другому типу исключения. Выбрасывая исключения и определяя собственные классы исключений, я почти всегда использую unchecked.
Только в исключительных ситуациях, например,
Исключения должны перехватывать что-то исключительное, регистрировать это и, если возможно, восстанавливать.
Если это часть обычного потока программы, вы должны справиться с этим в обычном режиме.