Контроль ошибок, меня производит бесконечный цикл

Я начинаю использовать try-catch. В этом примере я прошу число, и если пользователь вводит число, он увиден, если он пишет любую букву, отпускает ошибку.

Мое намерение состояло, в том, чтобы введя букву, я сорвался сообщение "Lo siento, has introducido letras", и что повернулся, чтобы просить число. Проблема состоит в том, что он показывает мне сообщение "Lo siento..." бесконечно.

/**
 * @param args the command line arguments
 */
public static void main(String[] args) {
    int num;
    boolean error;

    Scanner pedir = new Scanner(System.in);
    do {
        try {
            System.out.print("Inserte un numero: ");
            num = pedir.nextInt();
            System.out.println("El valor es " + num);
            error=false;
        } catch (InputMismatchException e) {
            error=true;
            System.out.println("Lo siento has introducido letras ");
        }
    }while(error);

}
1
задан 18.01.2017, 14:08
0 ответов

Ты не отлаживаешь число принятое в доме зло, а следовательно всегда вновь будет пробовать получать введенный первый раз.

Чтобы отлаживать недействительные данные ты должен делать чтение полной линии:

public static void main(String[] args) {
  int num;

  Scanner pedir = new Scanner(System.in);
  while (true) {
    System.out.print("Inserte un numero: ");
    try {
      num = pedir.nextInt();
      System.out.println("El valor es " + num);
      break;
    } catch (InputMismatchException e) {
      /* Limpiamos la entrada incorrecta */
      pedir.next();
      System.out.println("Lo siento, has introducido letras");
    } catch (NoSuchElementException e) {
      /* Nunca se captura, ver:
      https://docs.oracle.com/javase/7/docs/api/java/lang/RuntimeException.html */
      System.out.println("Fin de la entrada de datos");
      break;
    }
  }
}

С этим это должный быть быть достаточно, но имей в виду, что ты был бы должен подтверждать, если действительное поле с hasNextInt() вместо с одним try/catch:

public static void main(String[] args) {
  int num;

  Scanner pedir = new Scanner(System.in);
  while (true) {
    System.out.print("Inserte un numero: ");
    /* Comprobamos si quedan más datos en la entrada estándar */
    if (pedir.hasNext()) {
      if (pedir.hasNextInt()) {
        num = pedir.nextInt();
        System.out.println("El valor es " + num);
        break;
      } else {
        /* Limpiamos la entrada incorrecta */
        pedir.next();
        System.out.println("Lo siento, has introducido letras");
      }
    } else {
      System.out.println("Fin de la entrada de datos");
      break;
    }
  }
}
2
ответ дан 03.12.2019, 17:38
  • 1
    В части else, поместив num=pedir.next (); он дает мне ошибку. Несовместимый types, String cannot be convert String to Int –  18.01.2017, 14:36
  • 2
    Ошибка copy/paste, num = не будь должен быть ahí. Я это исправляю сейчас. –  18.01.2017, 14:37
  • 3
    Это собиралось говорить тебе, что удаляя номер = он выходит совершенным! То, что я не понимаю, является различием между try/catch и hasNextInt... –  18.01.2017, 14:38
  • 4
    try/catch обнаруживают ошибки / исключения во времени ejecució n и он захватывает их, чтобы действовать в зависимости от каждого задержанного события или делая acció n конец (finally), если задержание tambié n произведи другую excepció n. Это плохая одна prá ctica основываться на эти обнаружения, чтобы избегать делать правильный контроль в данные о вводе. Например, ни в одном из двух случаев не имеется в виду, что принимается один EOF, в обоих saltarí в excepció n не контролируемая типа NoSuchElementException. Я буду издавать мой ответ, чтобы созерцать этот случай с и без блока try/catch. –  18.01.2017, 14:52
  • 5
    Я изменил тебе ответ, чтобы являться примером, в котором блок try/catch, которые не могут захватывать ошибку. Один NoSuchElementException - unchecked exception . Чтобы пытаться có mo случается excepció n нажми Control + D (EOF) или набей echo | java ejemplo. –  18.01.2017, 15:35

Только ты должен добавлять pedir.next() в управлении ошибок:

public static void main(String[] args) {
    int num;
    boolean error;

    Scanner pedir = new Scanner(System.in);
    do {
        try {
            System.out.print("Inserte un numero: ");
            num = pedir.nextInt();
            System.out.println("El valor es " + num);
            error=false;
        } catch (InputMismatchException e) {
            error=true;
            System.out.println("Lo siento has introducido letras ");
            pedir.next();
        }
    }while(error);

}
3
ответ дан 03.12.2019, 17:38
  • 1
    Совершенный! Она была уже раздражена, не sabí в который podí чтобы быть! Большое спасибо :) –  18.01.2017, 14:19

Теги

Похожие вопросы