Я действительно запутался: Стандартный подход в Java - бросать исключения только в "ненормальных" условиях и не использовать их для сигнализации конца итератора.
примеры: Effective Java, пункт 57 ("Используйте исключения только для исключительных условий") и JavaSpecialists newsletter 162:
Управление потоком
Мы никогда не должны вызывать исключение, которое иначе можно предотвратить. Я видел код, где вместо проверки границ предполагается, что данные будут правильными, а затем отлавливаются RuntimeExceptions:
Вот пример плохого кода (пожалуйста, не пишите так):
public class Antipattern1 { public static void main(String[] args) { try { int i = 0; while (true) { System.out.println(args[i++]); } } catch (ArrayIndexOutOfBoundsException e) { // мы закончили } } }
тогда как стандартно использовать эту идиому в Python, например, StopIteration:
exception StopIteration
Вызывается методом next() итератора, чтобы сигнализировать, что больше нет значений. Это производное от Exception, а не от StandardError, поскольку в обычном применении это не считается ошибкой.
Почему это плохо для Java, но хорошо для Python?