Цикл обработки исключений Java

У меня есть кусок кода (который был упрощен до надевания здесь), который будет зацикливаться до тех пор, пока исключение не будет сгенерировано (где исключение выдается, если ввод неправильный). Тем не менее, он постоянно выдает исключение, независимо от того, что вход

function() throws Exception{
Str = input.next();
     if (!Str.equals("A") || !Str.equals("B")){
         throw new Exception("Invalid Input");
     }
}

это где функция называется

while (true){
        try {
        function();
        break;
    } catch (Exception e) {

        System.out.println(e);
    }
}

1 ответ

Из вашего комментария:

проблема не в условии if

Вы не правы здесь, это if состояние, которое вызывает проблемы.

Давайте проверим ваш if состояние:

if (!Str.equals("A") || !Str.equals("B"))

Это говорит: когда Str это не "А" или не "Б", то сделайте что-нибудь.

Давайте предположим, что Str это "C":

  • !Str.equals("A") -> правда
  • !Str.equals("B") -> верно (но не проверено, из-за "короткого замыкания" ||)

Теперь давайте предположим, Str это "А":

  • !Str.equals("A") -> ложь
  • !Str.equals("B") -> правда

Или "Б":

  • !Str.equals("A") -> правда
  • !Str.equals("B") -> ложь

Как видите, ваш вклад не может дать false для обеих проверок (чтобы избежать исключения), так как вы используете || (логическое "или") и Str не может быть "A" и "B" одновременно.

Вместо этого вы хотите: && (логическое "и").

if (!Str.equals("A") && !Str.equals("B")) {
    throw new Exception("Invalid Input");
}

Он выдаст исключение, только если на входе нет ни "A", ни "B".

Если вы предпочитаете использовать ||тогда вам нужно перенести отрицание ! немного:

if (!(Str.equals("A") || Str.equals("B"))) {
    throw new Exception("Invalid Input");
}

Это логически так же, как использование && выше.

Другие вопросы по тегам