Для начала звучит так, будто вы новичок Java. Если это так, позвольте мне предложить прочитать об обработке исключений в Java. Я думаю, это поможет вам понять причину такого поведения. Вот несколько быстрых уроков по этой теме c от Oracle: https://docs.oracle.com/javase/tutorial/essential/exceptions/
С учетом сказанного ниже приведено мое объяснение того, что вызывает поведение, которое вы описали: 1. flag1
остается верным. 2. цикл не останавливается.
1. Причина, по которой flag1
не установлена в true, заключается в том, что при возникновении исключения IllegalArgumentException весь код между местом, в котором он создается, и блоками перехвата исключений будет пропущен. Это включает пропуск строки flag1 = false;
.
2. Причина, по которой циклы while не завершаются при возникновении исключения IllegalArgumentException, заключается в том, что IllegalArgumentException наследуется от RuntimeException, как вы можете видеть здесь: https://docs.oracle.com/javase/7/docs/api/java/lang/IllegalArgumentException.html. Это означает, что ваш блок catch catch (RuntimeException ex)
будет перехватывать выброшенное исключение. Таким образом, произойдет то, что код в блоке захвата RuntimeException (retry = true;
) будет выполнен, а затем выполнение продолжится после блока try-catch. Поскольку это все еще внутри внешнего do-while l oop, цикл будет продолжаться.