Java 输入无效时循环代码时出现故障

Java 输入无效时循环代码时出现故障,java,loops,do-while,Java,Loops,Do While,我对Java相当陌生,我一直在上一门课,自己做一些小项目。我的计划是,每当由于输入无效字符串(即除了分数和百分比之外的任何内容)而到达最终的if语句时,都要让代码循环回到开头。我似乎不知道出了什么问题,它只循环if/else语句的部分。您犯了一个Java新手犯的典型错误。您本打算使用=,但无意中未将其键入为=。您可以修复输入错误,但有一个更好的解决方案可以在将来避免此问题 您不应该使用==来测试布尔值。相反,您应该按照以下模式重写代码: do { loop = false

我对Java相当陌生,我一直在上一门课,自己做一些小项目。我的计划是,每当由于输入无效字符串(即除了分数和百分比之外的任何内容)而到达最终的if语句时,都要让代码循环回到开头。我似乎不知道出了什么问题,它只循环if/else语句的部分。

您犯了一个Java新手犯的典型错误。您本打算使用
=
,但无意中未将其键入为
=
。您可以修复输入错误,但有一个更好的解决方案可以在将来避免此问题

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

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);
这个建议适用于几乎所有使用布尔操作数的
=
。(例外情况是
op1==op2
,其中op1或
op2
都不是布尔文本。)

更新

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

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

  • 如果用户输入的浮点数不正确,则会出现异常。这包括用户输入“100.0分”之类的内容的情况

  • 您不验证输入;e、 g.测试负面分数,分数大于最大值,百分比超出范围0..100

  • 最后,终止循环的方式很笨拙。最好是这样做:

    while (loop = true) {     // BUG!!!    
    
    while (loop == true) {    // WRONG
    
    while (loop) {            // CORRECT
    
    while (loop = false) {    // BUG!!
    
    while (loop == false) {   // WRONG
    
    while (!loop) {           // CORRECT
    
    while(true){
    //做事
    如果(…){
    //我们想终止循环
    
    break;//您犯了Java新手犯的一个典型错误。您本打算使用
    =
    ,但无意中将其键入为
    =
    。您可以修复打字错误,但有更好的解决方案可以在将来避免此问题

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

    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);
    
    此建议适用于几乎所有使用布尔操作数的
    =
    (例外是
    op1==op2
    ,其中op1
    op2
    都不是布尔文字。)

    更新

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

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

  • 如果用户输入的浮点数不正确,您将得到一个异常。这包括用户输入“100.0点”之类的数字的情况

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

  • 最后,终止循环的方式很笨拙。最好执行以下操作:

    while (loop = true) {     // BUG!!!    
    
    while (loop == true) {    // WRONG
    
    while (loop) {            // CORRECT
    
    while (loop = false) {    // BUG!!
    
    while (loop == false) {   // WRONG
    
    while (!loop) {           // CORRECT
    
    while(true){
    //做事
    如果(…){
    //我们想终止循环
    
    break;//由于您仍在努力理解,下面是编程问题的“示例解决方案”:

    while (true) {
        // do stuff
        if (...) {
            // we want to terminate the loop
            break;   // <<------
        }
        // do more stuff
    }
    
    import java.util.Scanner;
    导入java.util.NoSuchElementException;
    公开课范例{
    公共静态void main(字符串[]args){
    扫描仪kbdInput=新扫描仪(System.in);
    字符串模式=”;
    双百分比=-1;
    while(true){
    System.out.println(“输入‘分数’或‘百分比’:”);
    mode=kbdInput.next().toLowerCase();
    kbdInput.nextLine();
    如果(模式等于(“分数”)|模式等于(“百分比”)){
    打破
    }
    System.out.println(“我不明白,再试一次。”);
    }
    while(true){
    试一试{
    如果(模式等于(“分数”)){
    System.out.println(“您选择输入分数”);
    System.out.println(“在此处输入:”);
    double score=kbdInput.nextDouble();
    kbdInput.nextLine();
    System.out.println(“最好的分数是多少?”);
    double total=kbdInput.nextDouble();
    kbdInput.nextLine();
    百分比=分数/总数*100;
    如果(分数>=0.0&&total>0.0&&
    百分比>=0.0&&percent=0.0&&percent=0.0&&percent=90){
    等级=‘A’;
    }否则,如果(百分比>=80){
    等级=‘B’;
    }否则,如果(百分比>=70){
    等级=‘C’;
    }否则,如果(百分比>=60){
    等级='D';
    }否则{
    等级=‘F’;
    }
    System.out.println(“您得到”+百分比+
    “%.”表示字母级“+”级“+”;
    }
    }
    }
    
    注意事项:

  • 我已经将其分为两个循环。一个用于请求并验证输入分数的“模式”。第二个用于实际输入分数。(我从您的代码中推断出这是一个要求。这可能不正确。)

  • 与您的版本相比,输入的验证要多得多

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

  • 我显式地捕获并处理输入数字时的错误;请参阅异常处理程序

  • 我已经搬家了