如何让这个程序检查输入是否为整数而不导致运行时错误并使用标记值停止循环?

How do I make this program check if an input is an integer without causing an error in runtime and stop the loop with a sentinel value?

我一直在尝试从我的程序中找出一个运行时错误,该错误是在检查用户输入是否为整数时引起的,如果不是整数,则打印出一条错误消息,并请求另一个输入那是一个整数。我还注意到,现在通过检查整数,如果用户输入负整数,我的程序会不断要求更多输入而不是停止循环。这是我的程序代码中有问题的部分:

do
    {
        System.out.println("Enter an integer grade percentage: ");
        examScore = keyboard.nextInt();
        if (examScore != (int)examScore) {
            System.out.println("Not an integer, please try again.");            
                
            if (examScore >= 90 && examScore <=100) {
                gradeA++;
                totalScores++;
            }
            else if (examScore >= 80 && examScore <=89) {
                gradeB++;
                totalScores++;
            }
            else if (examScore >= 70 && examScore <=79) {
                gradeC++;
                totalScores++;
            }
            else if (examScore >= 60 && examScore <=69) {
                gradeD++;
                totalScores++;
            }
            else if (examScore >=0 && examScore <= 59)
                gradeF++;
                totalScores++; 
            }
        else {
            if (examScore >= 90 && examScore <=100) {
                gradeA++;
                totalScores++;
            }
            else if (examScore >= 80 && examScore <=89) {
                gradeB++;
                totalScores++;
            }
            else if (examScore >= 70 && examScore <=79) {
                gradeC++;
                totalScores++;
            }
            else if (examScore >= 60 && examScore <=69) {
                gradeD++;
                totalScores++;
            }
            else if (examScore >= 0 && examScore <=59)
                gradeF++;
                totalScores++;           
            }
        }while(examScore >=0);

感谢所有帮助!

您错过了最后一个 else if 的开场白 {

nextInt() returns 一个 int 那么 if (examScore != (int)examScore) { 有什么意义呢?

您可以使用Scanner.hasNextInt() 来检查用户是否输入了整数。如果不是,请使用输入并重试。

您可以利用 if/else if/else 中的这一事实来简化成绩条件,一旦执行一个块,其余部分将被跳过。

while (true) {
    System.out.println("Enter an integer grade percentage: ");
    do {
        // Check for integer
        while (!keyboard.hasNextInt()) {
            // Not an int? Consume and discard
            String input = keyboard.next();
            System.out.println("Not an integer, please try again.");
        }
        examScore = keyboard.nextInt();
    } while (examScore > 100); // Only except if in range
    if (examScore >= 90) {
        gradeA++;
    }
    else if (examScore >= 80) {
        gradeB++;
    }
    else if (examScore >= 70) {
        gradeC++;
    }
    else if (examScore >= 60) {
        gradeD++;
    }
    else if (examScore >= 0) {
        gradeF++;
    }
    else {
        // Must be negative
        break;
    }
    totalScores++; 
}

借用验证
    public static void main(String[] args) {
        final int[] scoreLimits = new int[]{90, 80, 70, 60, 0}; // this should be in descending order
        final int[] gradeCount = new int[scoreLimits.length];
        final char[] gradeLabel = new char[]{'A', 'B', 'C', 'D', 'F'};
        final Scanner keyboard = new Scanner(System.in);

        System.out.println("Enter an integer grade percentage between 0 and 100(both inclusive). Enter -1 to stop");
        while (true) {
            int examScore;
            do {
                // Check for integer
                while (!keyboard.hasNextInt()) {
                    // Not an int? Consume and discard
                    String input = keyboard.next();
                    System.out.println("Not an integer, please try again.");
                }
                examScore = keyboard.nextInt();
            } while (examScore != -1 && (examScore < 0 || examScore > 100)); // Only except if in range

            if (examScore == -1) {
                break;
            }

            for (int i = 0; i < scoreLimits.length; i++) {
                if (examScore >= scoreLimits[i]) {
                    ++gradeCount[i];
                    break;
                }
            }
        }
        System.out.println(Arrays.toString(gradeCount));
    }