Циклы Java - перерыв? Продолжать?

Я прочитал кучу тем об использовании break и continue и подозреваю, что проблема не обязательно в том, что я их использую, а в расположении моих циклов. В следующем коде я пытаюсь перебрать символы в строке, введенной пользователем, чтобы найти любые символы -. Если он найден, он выдаст пользователю ошибку о том, что было найдено отрицательное число, и завершит работу. В противном случае, если он не находит символ -, он должен распечатать все символы в строке.

Я использовал break в конце моего первого цикла, чтобы найти символ -, но он не продолжается до следующего цикла. Я тоже пробовал continue, но это не сработало. Циклы для меня новы, поэтому я могу ошибаться, все, что я знаю, это то, что мой первый цикл работает нормально и выдает ошибку, когда находит - в строке.

strNum1 = JOptionPane.showInputDialog ("Enter Number String");
for (int i = 0; i < strNum1.length(); i++) {
  char c = strNum1.charAt(i);
  if (c == '-') {
    System.out.println("Negative Digit Found - Exiting");
    break;
  }
}

for (int i = 0; i < strNum1.length(); i++) {
  char c = strNum1.charAt(i);
  if (c <= 9) {
    System.out.println(c);
  }
}

person Jesse Cleary    schedule 04.06.2015    source источник
comment
Первое нужно исправить форматирование. Заставьте свою IDE сделать соответствующий отступ в коде, а затем убедитесь, что ваш вопрос отражает это.   -  person Jon Skeet    schedule 04.06.2015
comment
Вы говорите, что хотите пропустить второй цикл for, если он «вырывается» из вашего первого цикла?   -  person almightyGOSU    schedule 04.06.2015
comment
Мое намерение состояло в том, чтобы запустить первый цикл, а затем, если что-то проверяется и отрицательный символ не найден, запустить второй цикл и напечатать все символы в строке.   -  person Jesse Cleary    schedule 04.06.2015


Ответы (7)


Оператор break прерывает работу только с первого цикла. Чтобы пропустить запуск второго цикла в случае обнаружения символа -, вы можете использовать некоторую переменную boolean, чтобы указать, должен ли выполняться второй цикл:

strNum1 = JOptionPane.showInputDialog ("Enter Number String");
boolean isValid = true;
for (int i=0; i<strNum1.length(); i++) {
        char c = strNum1.charAt(i);
        if (c == '-'){
            System.out.println("Negative Digit Found - Exiting");
            isValid = false;
            break;
        }
}
if (isValid) {
    for (int i=0; i<strNum1.length(); i++) {
        char c = strNum1.charAt(i);
        if (c <= '9'){
            System.out.println(c);
        }
    }
}
person Eran    schedule 04.06.2015
comment
Мне нравится этот подход. Однако я заметил, что хотя он найдет отрицательный символ и представит сообщение об ошибке, если отрицательных символов нет, он не печатает символы в строке. Даже если я возьму перерыв; он не переходит к проверке на isValid во второй части. - person Jesse Cleary; 04.06.2015
comment
@JesseCleary Это странно. Вы инициализировали переменную isValid значением true? - person Eran; 04.06.2015
comment
Я сделал, я вставил код именно так, как вы предложили. На самом деле, если я закомментирую первый раздел и просто оставлю Boolean isValid = true;, а затем сразу же перейду ко второму разделу, где он проверяет if (c <= 9), он все равно не печатает символы в строке, что кажется странным. - person Jesse Cleary; 04.06.2015
comment
Нет, это не странно. Вы, вероятно, захотите сделать if (c <= '9'), потому что числовое значение символа '9' не равно 9. - person ci_; 04.06.2015
comment
@ci_ Хороший вопрос. Я пропустил это. Хотя непонятно, зачем вообще нужна эта (частичная) проверка. Если цель состоит в том, чтобы разрешить только цифры, эта проверка, вероятно, должна быть в первом цикле и отклонять ввод, если он находит символ, который не является цифрой. - person Eran; 04.06.2015
comment
Я считаю, что вы правы. Как есть, он сообщает мне, есть ли отрицательный символ, но все равно печатает все символы, является ли он отрицательным символом или нет. - person Jesse Cleary; 04.06.2015
comment
@JesseCleary Он не напечатает ни одного символа, если обнаружит символ -. Об этом позаботится первый цикл. Однако любой другой символ, чье значение int меньше, чем значение int '0' (например, +, ,, ! и т. д.), будет напечатан. Ваш первый цикл должен подтвердить, что все символы >= '0' и <= '9' - person Eran; 04.06.2015
comment
Попался, я думаю, что я его прямо сейчас. Я ценю ваш (и каждый) вклад! Очень признателен! - person Jesse Cleary; 04.06.2015

Если вы замените break на return, он выйдет из всего метода. Похоже, это вероятно то, что вам нужно.

person Phil Anderson    schedule 04.06.2015
comment
За исключением того, что в вопросе нет признаков метода, поэтому вы не знаете, что еще в нем есть. - person ci_; 04.06.2015
comment
Согласованный. Отсюда вероятно - person Phil Anderson; 04.06.2015

'перерыв;' остановит выполнение цикла, в котором он находится, где «продолжить;» пропустит текущую «итерацию» в цикле.

 for(int x = 0; x < 10; x++)
 {
     if (x == 5)
        break;
      // other code
 }
 // more other code

Это приведет к выходу из цикла, как только x == 5, и не будет выполнять итерации с 6-й по 10-ю.

 for(int x = 0; x < 10; x++)
 {
     if (x == 5)
        break;
      // other code
 }
 // more other code

Это будет делать каждую итерацию, кроме 6-й итерации.

Но если вы хотите пропустить '// больше другого кода', вам нужно будет использовать 'return;', при условии, что ваш код находится в функции, и он пропустит остальную часть функции, которая в данном случае '// больше другого кода'.

person AzNjoE    schedule 04.06.2015

Используйте оператор return вместо break, если вы не хотите выполнять второй цикл после первого.

person Sourav Kanta    schedule 04.06.2015

Вы не говорите, должно ли число быть целым числом, поэтому я предполагаю, что да. Если это так, вместо использования циклов лучшим способом проверки ввода будет:

int num1;

try {
  num1 = Integer.parseInt(strNum1);
catch (NumberFormatException e) {
  //not a valid number, complain about it
}

if (num1<0) {
  //negative number not allowed, complain about it
}
person NickJ    schedule 04.06.2015

 for (int i=0; i<strNum1.length(); i++) {
    char c = strNum1.charAt(i);
         if (c == '-'){
            System.out.println("Negative Digit Found - Exiting");
        break;
        }
 }

можно изменить как

 if(strNum1.charAt(0) != '-'){
   for (int i=0; i<strNum1.length(); i++) {
    char c = strNum1.charAt(i);
    if (c <= 9){
        System.out.println(c);
    }
   }
 }
else {
 //negative number found...
 }

Таким образом, можно избежать ненужных операторов цикла for и break.

person FatherMathew    schedule 04.06.2015

Все ответы хороши, но если вы хотите повторять приглашение, пока не получите действительное значение, вам понадобится еще один цикл для этого, используя метки:

negative: while(true) {
    strNum1 = JOptionPane.showInputDialog ("Enter Number String");
    for (int i=0; i<strNum1.length(); i++) {
        char c = strNum1.charAt(i);
        if (c == '-'){
            System.out.println("Negative Digit Found - Exiting");
        continue negative;
        }
    break negative;
    }
}
person Mordechai    schedule 04.06.2015