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

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

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

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

Похоже, это связано: Предотвращение исключений и перехват исключений в Java

Ответы [ 10 ]

20 голосов
/ 09 июля 2010

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

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

for (int i : intArr) {
  System.out.println(i);
}
5 голосов
/ 09 июля 2010

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

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

Смотри также:

5 голосов
/ 09 июля 2010

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

3 голосов
/ 09 июля 2010

Как всегда "это зависит", и вы найдете много разных мнений. Вот мой

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

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

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

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

1 голос
/ 09 июля 2010

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

for(int i = 0; i < intArr.length; ++i) {
    System.out.println(intArr[i]);
} 
1 голос
/ 09 июля 2010

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

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

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

1 голос
/ 09 июля 2010

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

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

1 голос
/ 09 июля 2010

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

  • , когда метод не может делать то, что он должен делать
  • , чтобы не контролировать поток выполнения
1 голос
/ 09 июля 2010

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

1 голос
/ 09 июля 2010

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...