Java 当无限循环

Java 当无限循环,java,try-catch,do-while,Java,Try Catch,Do While,我正在尝试编写一个方法,要求用户输入一个正整数。如果未输入正整数,则会输出一条消息“请输入正值”。这部分不是问题所在。问题是,当我尝试实现捕获InputMissMatchException的try-catch语句时(如果用户意外输入字符或字符串),循环无限运行,并抛出与InputMistmatchException关联的错误消息 这是我的密码: private static int nonNegativeInt(){ boolean properValue = false;

我正在尝试编写一个方法,要求用户输入一个正整数。如果未输入正整数,则会输出一条消息“请输入正值”。这部分不是问题所在。问题是,当我尝试实现捕获InputMissMatchException的try-catch语句时(如果用户意外输入字符或字符串),循环无限运行,并抛出与InputMistmatchException关联的错误消息

这是我的密码:

private static int nonNegativeInt(){
        boolean properValue = false;
        int variable = 0;
        do {
            try {
                while (true) {
                    variable = scanner.nextInt();
                    if (variable < 0) {
                        System.out.println("Please enter a positive value");
                    } else if (variable >= 0) {
                        break;
                    }
                }
                properValue = true;
            } catch (InputMismatchException e){
                System.out.println("That is not a valid value.");
            }
        } while (properValue == false);
        return variable;
    } 
private static int nonNegativeInt(){
布尔属性值=false;
int变量=0;
做{
试一试{
while(true){
变量=scanner.nextInt();
if(变量<0){
System.out.println(“请输入正值”);
}else if(变量>=0){
打破
}
}
正确值=真;
}捕获(输入不匹配异常e){
System.out.println(“这不是一个有效值。”);
}
}while(properValue==false);
返回变量;
} 

您正在捕获异常,但没有更改变量property value的值,因此catch语句将永远运行。添加
properValue=true甚至catch语句中的
break
语句都提供了所需的功能


我希望我能帮忙

只需在捕获物中添加一条
break
语句即可。
顺便说一句,您可以通过如下方式重写
while
循环来摆脱它:

try {
    variable = scanner.nextInt();
    if (variable < 0) {
        System.out.println("Please enter a positive value");
    } else {
        properValue = true;
    }
}
//... 
试试看{
变量=scanner.nextInt();
if(变量<0){
System.out.println(“请输入正值”);
}否则{
正确值=真;
}
}
//... 

本质上,当给定的令牌无效时,扫描仪会遇到错误,因此无法超过该值。当下一次迭代重新开始时,scanner.nextInt()会再次尝试扫描下一个仍然无效的输入值,因为它从未通过该输入值

您要做的是添加行

scanner.next(); 
在catch子句中,基本上是说跳过那个标记

旁注:您的方法通常过长。你可以把它缩短成这个

private static int nonNegativeInt() {
    int value = 0;
    while (true) {
        try {
            if ((value = scanner.nextInt()) >= 0)
                return value;
            System.out.println("Please enter a positive number");
        } catch (InputMismatchException e) {
            System.out.println("That is not a valid value");
            scanner.next();
        }
    }
}

您可以在do while循环的开始处声明扫描程序,这样nextInt()就不会反复抛出异常

private static int nonNegativeInt(){
    boolean properValue = false;
    int variable = 0;
    do {
        scanner = new Scanner(System.in);
        try {
            while (true) {
                variable = scanner.nextInt();
                if (variable < 0) {
                    System.out.println("Please enter a positive value");
                } else if (variable >= 0) {
                    break;
                }
            }
            properValue = true;
        } catch (InputMismatchException e){
            System.out.println("That is not a valid value.");
        }
    } while (properValue == false);
    return variable;
} 
private static int nonNegativeInt(){
布尔属性值=false;
int变量=0;
做{
扫描仪=新扫描仪(System.in);
试一试{
while(true){
变量=scanner.nextInt();
if(变量<0){
System.out.println(“请输入正值”);
}else if(变量>=0){
打破
}
}
正确值=真;
}捕获(输入不匹配异常e){
System.out.println(“这不是一个有效值。”);
}
}while(properValue==false);
返回变量;
} 

这与

两个问题:

  • 你需要一个
    扫描器

    。。。而且

  • 你不需要两个循环。一个循环就可以了:

    private static int nonNegativeInt(){
        boolean properValue = false;
        int variable = 0;
        do {
            try {
                variable = scanner.nextInt();
                if (variable < 0) {
                    System.out.println("Please enter a positive value");
                    continue;
                 } else if (variable >= 0) {
                    properValue = true;
                 }
            } catch (InputMismatchException e){
                System.out.println("That is not a valid value.");
                scanner.next();
            }
        } while (properValue == false);
        return variable;
    } 
    
    private static int nonNegativeInt(){
    布尔属性值=false;
    int变量=0;
    做{
    试一试{
    变量=scanner.nextInt();
    if(变量<0){
    System.out.println(“请输入正值”);
    继续;
    }else if(变量>=0){
    正确值=真;
    }
    }捕获(输入不匹配异常e){
    System.out.println(“这不是一个有效值。”);
    scanner.next();
    }
    }while(properValue==false);
    返回变量;
    } 
    

基本相同的帖子是的,这篇帖子仍然不允许用户纠正错误并输入实际值,只会给你零。这也不会有帮助,因为完全退出循环只会在用户希望重试并输入有效输入时返回0。简单而优雅的解释。非常感谢。感谢所有留下答案的人。:)