Разрыв 2-х вложенных циклов «сразу»

1

Посмотрите следующий код (Java)

 while((str=br.readLine())!=null)
        {
            int tempCounter=0;

            for(int i=0;i<str.length();i=i+3)
            {
                String word = str.substring(i, i+3);
                //  System.out.println(word);
                int insert = db.insert(index, word);
                if(insert<0)
                {
                    break;
                }
                tempCounter++;
            }
            index++;

            System.out.println("Index Updated: "+index);
            System.out.println(String.valueOf("Total words in this run: "+tempCounter));

            if(index==5)
            {
                break;
            }

        }

если insert меньше 0, мне нужно сломать как циклы for и while. Как я могу это сделать?

Проблема здесь в том, что мне нужно разбить "обе" циклы, если insert меньше 0. И вы не можете добавлять две команды break один за другим, даже с метками.

  • 1
    использовать labledstatements
  • 0
    или вы можете сделать, если (index == 5 || insert <0) {break; }
Показать ещё 1 комментарий
Теги:
for-loop
nested-loops
while-loop
break

6 ответов

1

Вы можете попробовать этот простой пример, чтобы увидеть, как работает меченый цикл:

public static void main(String[] args) {
    int i = 0; int j = 0;
    EXIT: for (; i < 10; i++) {
        for (; j < 10; j++) {
            if (i * j > 50) {
                break EXIT;
            }
        }
        j = 0;
    }
    System.out.printf("Finished with i=%s and j=%s\n", i, j);

}

ВЫВОД:

Finished with i=6 and j=9
  • 1
    То, что вы можете писать for циклов и if операторы без скобок, не означает, что вы должны ...
  • 0
    По моему мнению, если в одной строке появляется одна инструкция body, вам не нужно добавлять фигурные скобки (при условии, что вы не используете автоформатирование вашей IDE, чего я никогда не делал). Но это уже другая тема, с множеством разных мнений по этому поводу. Защитник-программист всегда использовал фигурные скобки, но для улучшения читаемости я иногда их опускаю (редко).
Показать ещё 1 комментарий
0

ИМО, исключение нецелесообразно; ярлык редко встречается и вряд ли будет понят будущим читателям.

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

boolean isInsertFail = false;

while((! isInsertFail) && (str=br.readLine())!=null))
        {
            int tempCounter=0;

            for(int i=0;(! isInsertFail) && i<str.length();i=i+3)
            {
                String word = str.substring(i, i+3);
                //  System.out.println(word);
                int insert = db.insert(index, word);
                if(insert<0)
                {
                    isInsertFail = true;
                }
                tempCounter++;
            }

            if (!isInsertFail) {
                index++;

                System.out.println("Index Updated: "+index);
                System.out.println(String.valueOf("Total words in this run: "+tempCounter));

                if(index==5)
                {
                    break;
                }
            }
        }

Обратите внимание, что в Eclipse можно щелкнуть по isInsertFail, и подсветка синтаксиса должна проиллюстрировать его использование.

  • 0
    в любом случае, отслеживание верхнего цикла с label и прерывание только того, что тоже нарушит вспомогательный цикл?
0

+1.. @AntonH.. label - это первый вариант. Если вы запутались, как использовать метку.. вы можете использовать логическую переменную, как показано ниже.

while (...) {

    boolean brk = false;
    for (...) {
        if(insert<0)
        {   brk = true;
            break;
        }
    }
    if(brk)
    {
        break;
    }
}
0

Ваш вопрос уже частично ответил здесь. Используйте метку перед линией цикла while, например OUTMOST, тогда, когда вставка меньше 0, "break OUTMOST". Например:

OUTMOST:
    while(someCondition) {
        for(int i = 0; i < someInteger; i++) {
            if (someOtherCondition)
                break OUTMOST;
        }
    }
0
 while((str=br.readLine())!=null)
 {
        int tempCounter=0;
        boolean check = false;
        for(int i=0;i<str.length();i=i+3)
        {
            String word = str.substring(i, i+3);
            //  System.out.println(word);
            int insert = db.insert(index, word);
            if(insert<0)
            {
                check = true;
                break;
            }
            tempCounter++;
        }
        index++;
        if(check)
            break;

        System.out.println("Index Updated: "+index);
        System.out.println(String.valueOf("Total words in this run: "+tempCounter));

        if(index==5)
        {
            break;
        }

    }

Вы можете сделать это

0

Один из подходов заключается в использовании исключения, в зависимости от ожидаемого результата процедуры db.insert.

Короче говоря, создайте новое исключение EDBInsertionException (класс, расширяющий исключение) и создайте исключение в цикле for.

try
{

    while((str=br.readLine())!=null)
    {
        int tempCounter=0;

        for(int i=0;i<str.length();i=i+3)
        {
            String word = str.substring(i, i+3);
            //  System.out.println(word);
            int insert = db.insert(index, word);
            if(insert<0)
            {
                throw new EDBInsertionException("No record inserted: " + insert);
            }
            tempCounter++;
        }
        index++;

        System.out.println("Index Updated: "+index);
        System.out.println(String.valueOf("Total words in this run: "+tempCounter));

        if(index==5)
        {
            break;
        }

    }
}
catch (EDBInsertionException e)
{
    // MZ: The database insertion has failed
    log.error(e.getMessage(), e);

    // MZ: Supplemental action: Delegate, escalate, rollback, etc           
}

РЕДАКТИРОВАТЬ

Развернутый пример, иллюстрирующий потенциальное использование исключения (пользователя).

  • 0
    Это не то, для чего нужны исключения.
  • 0
    Пожалуйста, уточните, я считаю, что это исключение из рабочего процесса по умолчанию (запись не может быть вставлена, что вносит исключение в ожидаемый результат).
Показать ещё 2 комментария

Ещё вопросы

Сообщество Overcoder
Наверх
Меню