虽然循环打印不正确

时间:2015-02-01 19:57:47

标签: java

我正在阅读用户的数据(考试分数)。然后我正在检查成绩。之后我正在展示成绩。然后我问用户他们是否想要进入另一个年级,如果他们说是,那么我要求他们输入另一个考试成绩。但是我在这里使用try / catch来验证他们输入的数据类型。如果他们输入除了整数之外的任何东西,那么我试图再次循环并询问他们是否想要输入另一个等级但是还显示输入整数错误消息。然而,在这里循环打印你想要两次输入另一个等级并且考试分数两次它打印旧分数并且它打印你想要两次输入另一个等级陈述,为什么会发生这种情况?

import java.util.InputMismatchException;
import java.util.Scanner;


public class CatchingException {

public static void main(String[] args) {
    Scanner scan = new Scanner(System.in);
    int score;
    String choice;
    boolean loop = true;


    try {
        System.out.println("Enter your percentage mark: ");
        score = scan.nextInt();


        do {
            if(score <40) {
                System.out.println("You FAILED");
            }else if(score >=40 && score <50){
                System.out.println("Your grade: PASS MARK");
            }else if(score >=50 && score <60) {
                System.out.println("Your grade: 2:2");
            }else if (score >=60 && score <70) {
                System.out.println("Your grade: 2:1");
            }else {
                System.out.println("Your grade: 1:1");
            }

            System.out.println("Do you want to enter another grade: ");
            choice = scan.next();
            if(choice.equalsIgnoreCase("yes")) {
                System.out.println("Enter your percentage mark: ");
                try{
                    score = scan.nextInt();
                }catch(InputMismatchException e) {
                    System.err.println("Enter Integer");
                    loop = false;
                }

            }
        }while(!loop);

    }catch(InputMismatchException e) {
        System.err.println("Incorrect Input ");
    }

    System.out.println("program terminated");
    scan.close();

}

  }

4 个答案:

答案 0 :(得分:0)

尝试使用分支语句和标签简化此操作!

import java.util.InputMismatchException;
import java.util.Scanner;


public class CatchingException {

    public static void main(String[] args) {


        Scanner scan = new Scanner(System.in);
        int score;
        String choice;

        Main:
        while (true) { //this will continue until we call "break Main;"
            try {
                System.out.println("Enter your percentage mark: ");
                score = scan.nextInt();

                if (score < 40) {
                    System.out.println("You FAILED");
                } else if (score >= 40 && score < 50) {
                    System.out.println("Your grade: PASS MARK");
                } else if (score >= 50 && score < 60) {
                    System.out.println("Your grade: 2:2");
                } else if (score >= 60 && score < 70) {
                    System.out.println("Your grade: 2:1");
                } else {
                    System.out.println("Your grade: 1:1");
                }

                Prompt:
                while (true) { //this will continue until we call "break Prompt;"
                    System.out.println("Do you want to enter another grade: ");
                    choice = scan.next();
                    try {
                        if (choice.equalsIgnoreCase("yes")) {
                            continue Main; //OK. Start again at "Main:"
                        } else if (choice.equalsIgnoreCase("no"))
                            break Main; //OK. We're done.
                        else {
                            System.err.println("Incorrect Input ");
                            continue Prompt; //whoops! try asking again.
                        }
                    } catch (InputMismatchException e) {
                        System.err.println("Incorrect Input ");
                        continue Prompt; //whoops! try asking again.
                    }
                }
            } catch (InputMismatchException e) {
                System.err.println("Incorrect Input ");
                continue Main; //whoops! try another input.
            }
        }
        System.out.println("program terminated");
        scan.close();
    }
}

答案 1 :(得分:0)

首先,您设置loop变量的方式表明,只要looptrue,您就希望继续进行迭代。在这种情况下,您应该将while(!loop);更改为while (loop);

之后,你必须看看如果用户在被问及是否想要输入新成绩时写“否”会发生什么。实际上(通过上述更改),您将继续迭代。要解决此问题,您可以更改

System.out.println("Do you want to enter another grade: ");
choice = scan.next();
if(choice.equalsIgnoreCase("yes")) {
    System.out.println("Enter your percentage mark: ");
    try{
        score = scan.nextInt();
    }catch(InputMismatchException e) {
        System.err.println("Enter Integer");
        loop = false;
    }
}

类似

System.out.println("Do you want to enter another grade: ");
choice = scan.next();
if(choice.equalsIgnoreCase("no")) {
    loop = false;
}

这将使任何输入(“ no ”除外)导致循环继续迭代。 (如果您只想“”工作,那么通过一些额外的检查来解决它应该很容易。)

当然,这样做需要你把

System.out.println("Enter your percentage mark: ");
score = scan.nextInt();

do-while循环内。

do {
    System.out.println("Enter your percentage mark: ");
    score = scan.nextInt();

如果您想在用户未输入正确的整数时继续询问百分比标记,您可以执行以下操作:

System.out.println("Enter your percentage mark: ");
while (!scan.hasNextInt()) {
    System.out.println("Please enter a valid percentage mark: ");
    scan.next();
}
score = scan.nextInt();

这会一直询问,直到用户输入实际的整数。

答案 2 :(得分:0)

由于您的问题是why is this happening,我会尝试向您解释。我的示例输入如下:

Enter your percentage mark: 
70
Your grade: 1:1
Do you want to enter another grade: 
yes
Enter your percentage mark: 
a

a不是有效整数,因此Scanner#nextInt()会抛出InputMismatchException并且程序“进入”catch块:

catch(InputMismatchException e) {
    System.err.println("Enter Integer");
    loop = false;
}

此处程序打印错误消息并将loop设置为false。由于while条件while(!loop),它将执行新的循环迭代。请注意Scanner#nextInt()没有“读取”(并删除)输入流中的无效输入,因此它仍然存在。

所以我们再来一次:

do {
    if(score <40) {
        System.out.println("You FAILED");
    }
    //...

您可能会注意到,此处没有score = scan.nextInt();声明,因此,该程序会重复使用旧分数输入70。由于这个事实,它再次打印相同的分数消息(到目前为止的完整输出):

Enter your percentage mark: 
70
Your grade: 1:1
Do you want to enter another grade: 
yes
Enter your percentage mark: 
a
Enter Integer
Your grade: 1:1

分数验证后,如果我们想要输入另一个分数,它会再次询问我们:

System.out.println("Do you want to enter another grade: ");
choice = scan.next();

这是另一个问题:我们在上一次迭代中输入的a仍然可用,并且由于Scanner#next()接受此输入,choice现在将是"a" 。 这就是为什么这个if语句返回false并且它的正文将被跳过("a"不等于"yes"):

if(choice.equalsIgnoreCase("yes")) {

我们的情况是,a已从输入流中消失,loop仍设置为false。因此,程序将采用另一个循环迭代,我们处于循环的开始(再次):

do {
    if(score <40) {
        System.out.println("You FAILED");
    }
    //...

而且,我们现在还没有读到现在的分数。相反,我们重复使用得分70的旧输入。这意味着,我们得到完全相同的消息:

Your grade: 1:1

好消息是:a已从输入流中消失,而下一个问题确实请求用户提供新输入:

System.out.println("Do you want to enter another grade: ");
choice = scan.next();

所以由他决定他想要什么。


正如您现在所看到的,您需要阅读catch块中的无效输入,否则以后会感到烦恼。您应该在score循环的开头阅读新的do/while,否则您可能会重复使用旧的输入。

我希望这个答案可以帮助你更多地理解你的程序:)。您应该花一些时间来学习如何使用调试器。这样的情况非常有用。

答案 3 :(得分:0)

老实说,你没有理由在这里做一个do-while循环。除非这就像一个演示使用do循环的作业练习,否则你应该只使用它: 1)它使代码更容易阅读
2)使过程更容易

我自己无法阅读您的代码。我只是这样做,它工作正常。 注意:我没有添加任何尝试捕获,但如果你必须知道如何做,以及如果用户没有输入是或否。只是一个基本的例子。

public static void main(String[] args) 
{
    Scanner scan = new Scanner(System.in);
    int score;
    String choice;
    while(true)
    {
        System.out.println("Enter your percentage mark: ");
        score = scan.nextInt();
        if(score <40) 
        {
            System.out.println("You FAILED");
        }
        else if(score >=40 && score <50)
        {
            System.out.println("Your grade: PASS MARK");
        }
        else if(score >=50 && score <60) 
        {
            System.out.println("Your grade: 2:2");
        }
        else if (score >=60 && score <70) 
        {
            System.out.println("Your grade: 2:1");
        }
        else 
        {
            System.out.println("Your grade: 1:1");
        }

        System.out.println("Do you want to enter another grade: ");
        choice = scan.next();

        if(choice.equalsIgnoreCase("no"))
        {
            System.out.println("Program terminated");
            scan.close();
            break;
        }
    }
}