Эта программа просит пользователя ввести свой идентификатор студента, который должен быть целым числом от 0 до 999999. Закомментированный метод testID использует цикл do while с внутренним циклом while, который гарантирует, что пользователь вводит только целочисленные значения. Этот метод работает без проблем. Пытаясь переписать код (второй метод testID) каждый раз, когда я запускаю программу и набираю строковое или символьное значение, я получаю inputMismatchException. При первом способе этого не происходит. Может кто-нибудь объяснить, почему это происходит?

import java.util.*;
public class StudentID{

    public static int studentID= -1;
    public static Scanner input = new Scanner(System.in);

    public static void main(String[] args){
        testID();
    }

    /*
    public static void testID(){
        System.out.println("Enter your Student EMPLID (0-999999):");
        do{
            while (!input.hasNextInt()){
                input.nextLine();
                System.out.println("Enter a valid Student EMPLID (0-999999).");
            }
            studentID = input.nextInt();
            if(0 > studentID || studentID > 999999){
                input.nextLine();
                System.out.println("Enter a valid Student EMPLID (0-999999).");
            }
        } while (0 > studentID || studentID > 999999);
        System.out.println("Student EMPLID: " + studentID);
    }

    */

    public static void testID(){
        System.out.println("Enter your Student EMPLID (0-999999:)");
        while ((!input.hasNextInt()) && (0 > studentID) && (studentID > 999999)){
            input.nextLine();
            System.out.println("Enter a valid Student EMPLID (0-999999:)");
        }
        studentID = input.nextInt();
        System.out.println("Student EMPLID: " + studentID);
    }   

}
0
BamBamBondy 13 Ноя 2018 в 21:07

1 ответ

Лучший ответ

Проблема в логике внутри while. В комментированном методе testID() вы проверили выполнение следующего условия:

while(!input.hasNextInt()) {
    ....
}

Таким образом, для нецелочисленного ввода input.hasNextInt() вернет false и !hasNextInput(), следовательно, вернет true, и while будет продолжать цикл до тех пор, пока не будет введено действительное integer был введен.

Теперь в случае 2 условие внутри while всегда ложно,

while(!input.hasNextInt()) && (0 > studentID) && (studentID > 999999) {
    ...
}

Видите ли, здесь для studentID по умолчанию установлено значение -1, поэтому, хотя !input.hasNextInt() вернул true, как ожидалось, результат anding этого true с (studentID > 999999) равно false. Таким образом, код никогда не войдет в цикл while и перейдет к следующей строке, которая оказывается,

studentID = input.nextInt();

Это вызовет ошибку InputMismatchException, поскольку введенное значение не было integer

1
StaticBeagle 13 Ноя 2018 в 18:43