Java: бесконечный цикл после if внутри цикла

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

То, что я / хотел / произошло, было иметь его тогда (в случае сбоя if), перезапустить исходный внутренний цикл - следовательно, внешний цикл. Но вместо этого, после того как он не выполнил оператор if, он снова и снова начинает повторять "phrase2".

Вот упрощенный код:

int x = 1;
int y = 1;
int i = 0;
while(i == 0)
{
    while(<condition that is false>)
    {
        System.out.println("phrase1");
        a = input.nextInt();
        b = input.nextInt();        
    }
    if(<condition that is false>)
    {
        i = 1;
    }
    else
    {
        System.out.println("phrase2");
    }
}

Спасибо за помощь несмотря ни на что!

РЕДАКТИРОВАТЬ: Для акцента... Что происходит: бесконечный цикл, извергающий "phrase2". Что я хотел: после выполнения else я хотел снова попасть во внутренний цикл.


person anakhro    schedule 06.03.2014    source источник
comment
Похоже, что как только вы нажмете на регистр фразы2, вы никогда не обновите никакие другие данные, и, конечно, условия, которые раньше были ложными, остаются таковыми. Возможно, вы захотите выполнить некоторую повторную инициализацию в операторе else, чтобы правильно перезапуститься.   -  person dlev    schedule 06.03.2014
comment
Если вы правы в том, что <condition that is false> действительно всегда ложно, то i никогда не меняется с нуля, поэтому, конечно, while(i == 0) будет работать бесконечно. i нужно как-то изменить.   -  person aliteralmind    schedule 06.03.2014
comment
Возможно, проблема заключается в самих условиях; не могли бы вы добавить их?   -  person AJMansfield    schedule 06.03.2014
comment
в вашем предложении else сделайте ‹ложное условие› истинным   -  person rainkinz    schedule 06.03.2014
comment
Похоже, у вас приступ спагетти; рассматривали ли вы способы реструктуризации кода, чтобы полностью избежать этой проблемы?   -  person AJMansfield    schedule 06.03.2014
comment
@aliteralmind Условия зависят от a и b, которым предоставляется возможность измениться во внутреннем цикле. Я также должен добавить, что условия действительно длинные и довольно грязно сделаны.   -  person anakhro    schedule 06.03.2014
comment
И не могли бы вы пояснить, какие части вашего описания соответствуют вашим ожиданиям, а какие — тому, что на самом деле происходит.   -  person AJMansfield    schedule 06.03.2014
comment
Привет, вам нужно каким-то образом установить условие для оператора if в true, чтобы он мог ввести этот оператор if. То же самое касается внутреннего цикла.   -  person Alvin Bunk    schedule 06.03.2014
comment
Нам нужно больше контекста, чтобы помочь вам. Мы все в основном говорим, что должен быть терминатор цикла, но, поскольку ваш код настолько абстрактен, мы не можем знать, как его реализовать.   -  person aliteralmind    schedule 06.03.2014
comment
@AlvinBunk установит a и b так, чтобы они были неверными для внутреннего цикла, чтобы этот цикл запустился снова?   -  person anakhro    schedule 06.03.2014
comment
Хотя ваша попытка mcve приветствуется, прочитайте эту страницу и исправьте свой пример.   -  person AJMansfield    schedule 06.03.2014
comment
Привет @anakhronizein. По сути, ваш код выглядит нормально. Единственная причина, по которой он продолжает зацикливаться phrase2 снова и снова, заключается в том, что вы (я так полагаю) не меняете условие <condition that is false> для первого цикла while. Как только вы это сделаете, будет введен первый цикл while, но, к сожалению, если он следует за циклом while после него, он запустится, а затем выйдет из внешнего цикла. Это то, что вы хотели сделать? Мне кажется, что вы, возможно, хотели, чтобы оператор if имел другое условие для проверки (я могу ошибаться).   -  person Alvin Bunk    schedule 06.03.2014


Ответы (3)


Какое бы условие вы ни использовали во внутреннем цикле, просто убедитесь, что оно истинно.

else
{
    System.out.println("phrase2");
    // SET THIS TO TRUE: <condition that is false>
}

Таким образом, внутренний цикл снова сработает.

person domdomcodecode    schedule 06.03.2014
comment
Спасибо, это было проблемой. Очень признателен! - person anakhro; 06.03.2014
comment
Нет проблем, @anakhronizein - person domdomcodecode; 06.03.2014

Ваш элемент управления никогда не входит в приведенный ниже оператор if

if(<condition that is false>)
{
    i = 1;
}

Возможно, вам придется настроить свои условия так, чтобы они вошли в вышеуказанный блок if. Введите System.out.println внутри оператора if для отладки.

person Gurubaran    schedule 06.03.2014
comment
Это не совсем то, о чем он спрашивает. - person domdomcodecode; 06.03.2014

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

boolean needToRetry;
do {
    needToRetry = false;
    // do whatever
    if (somethingWentWrong) {
        needToRetry = true;
        // set this at any point where you find you will need to go back
    }
} while (needToRetry);

Важно то, что вам нужно каждый раз сбрасывать свой флаг (needToRetry) в начале цикла. (P.S. Есть и другие способы сделать это, используя break или continue, хотя лично мне не нравится использовать continue.)

person ajb    schedule 06.03.2014