输入无效时无法循环代码

时间:2016-10-08 01:30:45

标签: java loops do-while

do {
            loop = false;
            if (userInput.equalsIgnoreCase("Score")){
                System.out.println("You have chose to input a score.\nEnter your score here: ");
                score = kbInput.nextDouble();
                System.out.println("What was the best possible score?");
                total = kbInput.nextDouble();
                finalScore = score / total * 100;
                percent = (finalScore + "%");
                if (finalScore >= 90){
                    grade = 'A';
                } else if (finalScore >= 80){
                    grade = 'B';
                } else if (finalScore >= 70){
                    grade = 'C';
                } else if (finalScore >= 60){
                    grade = 'D';
                } else {
                    grade = 'F';
                }
                System.out.println("You got " + percent + ". Which is a letter grade '" + grade + "'.");
                loop = false;
            } else if (userInput.equalsIgnoreCase("Percent")) {
                System.out.println("You have chosen to input a percent.\nEnter your percent here: ");
                finalScore = kbInput.nextDouble();
                if (finalScore >= 90){
                    grade = 'A';
                } else if (finalScore >= 80){
                    grade = 'B';
                } else if (finalScore >= 70){
                    grade = 'C';
                } else if (finalScore >= 60){
                    grade = 'D';
                } else {
                    grade = 'F';
                }
                System.out.println("You got a letter grade '" + grade + "'.");
                loop = false;
            } else {
                System.out.println("Sorry, I don't understand that.");
                loop = true;
            }
        } while (loop = true);

我是Java的新手,我自己上课并做迷你项目。我的计划是每当你到达最后的if语句时,由于输入一个无效的字符串(即除了Score和Percent之外的任何内容),代码循环回到开头。我似乎无法弄清楚什么是错的,它只是循环if / else语句的部分。

2 个答案:

答案 0 :(得分:4)

你犯了一个Java新手所犯的经典错误。您打算使用==,但意外错误输入=。你可以解决这个问题,但是有一个更好的解决方案可以避免将来出现这个问题。

您不应该使用==来测试布尔值。相反,您应该按照以下模式重写代码:

while (loop = true) {     // BUG!!!    

while (loop == true) {    // WRONG

while (loop) {            // CORRECT

while (loop = false) {    // BUG!!

while (loop == false) {   // WRONG

while (!loop) {           // CORRECT

这个建议几乎适用于==与布尔操作数的每一次使用。 (例外情况为op1 == op2,其中 op1op2 布尔文字。)

<强>更新

您从用户那里获得输入的方式也存在问题。

  1. 您没有在循环中阅读userInput。这可能是一个问题,取决于要求,以及在循环开始之前是否/如何初始化。

  2. 如果用户输入错误的浮点数,您将收到异常。这包括用户输入类似“100.0点”的情况。

  3. 您不验证输入;例如测试负分数,分数大于最大值,百分比超出范围0..100。

  4. 最后,你终止循环的方式是笨重的。做这样的事情会更好:

    while (true) {
        // do stuff
        if (...) {
            // we want to terminate the loop
            break;   // <<------
        }
        // do more stuff
    }
    

答案 1 :(得分:1)

由于您仍在努力理解,这里有一个&#34;样本解决方案&#34;编程问题:

import java.util.Scanner;
import java.util.NoSuchElementException;

public class Example {
    public static void main(String[] args) {
        Scanner kbdInput = new Scanner(System.in);
        String mode = "";
        double percent = -1;
        while (true) {
            System.out.println("Enter 'score' or 'percent': ");
            mode = kbdInput.next().toLowerCase();
            kbdInput.nextLine();
            if (mode.equals("score") || mode.equals("percent")) {
                break;
            }
            System.out.println("I don't understand that.  Try again.");
        }
        while (true) {
            try {
                if (mode.equals("score")){
                    System.out.println("You chose to input a score.");
                    System.out.println("Enter it here: ");
                    double score = kbdInput.nextDouble();
                    kbdInput.nextLine();
                    System.out.println("What is the best score?");
                    double total = kbdInput.nextDouble();
                    kbdInput.nextLine();
                    percent = score / total * 100;
                    if (score >= 0.0 && total > 0.0 &&
                        percent >= 0.0 && percent <= 100.0) {
                        break;
                    }
                    System.out.println("The score / best score you " +
                       "gave make no sense.");
                } else if (mode.equals("percent")) {
                    System.out.println("You chose to input a percent.");
                    System.out.println("Enter it here: ");
                    percent = kbdInput.nextDouble();
                    kbdInput.nextLine();
                    if (percent >= 0.0 && percent <= 100.0) {
                        break;
                    }
                    System.out.println("The percent you gave is not " +
                       "between 0 and 100.");
                }
            } catch (NoSuchElementException ex) {
                kbdInput.nextLine();
                System.out.println("You entered an invalid number.");
            }
            System.out.println("Try again.");
        }
        if (percent >= 0.0 && percent <= 100.0) {
            char grade;
            if (percent >= 90){
                grade = 'A';
            } else if (percent >= 80){
                grade = 'B';
            } else if (percent >= 70){
                grade = 'C';
            } else if (percent >= 60){
                grade = 'D';
            } else {
                grade = 'F';
            }
            System.out.println("You got " + percent +
                   "%. Which is a letter grade '" + grade + "'.");
        }
    }
}

需要注意的事项:

  1. 我把它分成了两个循环。一个请求并验证&#34;模式&#34;输入分数。第二个实际输入它们。 (我已经推断这是您的代码的要求。这可能不正确。)

  2. 与您的版本相比,输入的验证要多得多。

  3. 我使用了kbdInput.nextLine()来消费&#34;在一些地方不需要的输入。请注意,next方法会留下他们不想要或无法在输入缓冲区中识别的任何输入字符。如果您不小心,下一次调用nextXxxx将尝试再次解析相同的字符。

  4. 我明确地捕捉并处理输入数字时的错误;看到异常处理程序。

  5. 我已移动常用代码来计算并显示等级到最后。

  6. 我已将多行println语句更改为单独的语句。这是有充分理由的。

    • "\n"并不总是输出换行符的正确方式。这取决于执行平台
    • println将正确执行此操作,假设输出的目的地是运行代码的同一台计算机。

    • 另请参阅:System.out.println() vs \n in Java

  7. 最后,此代码不会处理用户在键盘上输入END-OF-FILE的情况(例如Linux上的^ D)。

    练习:看看如果你这样做会发生什么。弄清楚会发生什么,并找到适当的解决方案。