Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/svn/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 使用扫描仪时无限循环?_Java_While Loop_Infinite Loop_Java.util.scanner - Fatal编程技术网

Java 使用扫描仪时无限循环?

Java 使用扫描仪时无限循环?,java,while-loop,infinite-loop,java.util.scanner,Java,While Loop,Infinite Loop,Java.util.scanner,试试这个。如果在第一次正确执行时尝试整数。但是,如果输入了错误的文本类型,它将变成一个无限循环,即使输入int next并跳过将布尔值赋值为true。这是为什么?您的问题在于未处理行尾令牌,因此扫描仪处于挂起状态。您想这样做: boolean z = false; do { try { a = sc.nextInt(); z = true; } catch(Exception e) { } } while(!z); 另外,whil

试试这个。如果在第一次正确执行时尝试整数。但是,如果输入了错误的文本类型,它将变成一个无限循环,即使输入int next并跳过将布尔值赋值为true。这是为什么?

您的问题在于未处理行尾令牌,因此扫描仪处于挂起状态。您想这样做:

boolean z = false;
do {
    try {
        a = sc.nextInt();
        z = true;
    }
    catch(Exception e) {
    }
}
while(!z);
另外,while(z==false)的形式不好。用while(!z)你会好得多。这可以防止while(z=false)错误,并且是一种更简洁的表达方式

为Marcelo编辑:

马塞洛,谢谢你的意见和建议!您是说下面if块中的条件不会更改布尔值spam吗

import java.util.Scanner;

public class Foo2 {
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        int a = 0;
        boolean catcher = false;
        do {
            try {
                System.out.print("Enter a number: ");
                a = sc.nextInt();
                catcher = true;
            } catch (Exception e) {
            } finally {
                sc.nextLine();
            }

        }
        // !!while(catcher == false);
        while (!catcher);

        System.out.println("a is: " + a);
    }
}

因为如果它真的改变了它,如果编码人员打算编写if(spam==false),那么可能会有微妙而危险的副作用。再次感谢你帮我澄清这一点

您的问题在于未处理行尾令牌,因此扫描仪处于挂起状态。您想这样做:

boolean z = false;
do {
    try {
        a = sc.nextInt();
        z = true;
    }
    catch(Exception e) {
    }
}
while(!z);
另外,while(z==false)的形式不好。用while(!z)你会好得多。这可以防止while(z=false)错误,并且是一种更简洁的表达方式

为Marcelo编辑:

马塞洛,谢谢你的意见和建议!您是说下面if块中的条件不会更改布尔值spam吗

import java.util.Scanner;

public class Foo2 {
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        int a = 0;
        boolean catcher = false;
        do {
            try {
                System.out.print("Enter a number: ");
                a = sc.nextInt();
                catcher = true;
            } catch (Exception e) {
            } finally {
                sc.nextLine();
            }

        }
        // !!while(catcher == false);
        while (!catcher);

        System.out.println("a is: " + a);
    }
}

因为如果它真的改变了它,如果编码人员打算编写if(spam==false),那么可能会有微妙而危险的副作用。再次感谢你帮我澄清这一点

这个代码没有什么意义。没有声明变量catcher,而且在循环中肯定没有更改。也许你抄错了?对于这样的问题,最好尽可能多地发布一个小型的自包含的可编译程序。这一行应该是while(z==false)???我猜是的,但即使这样也不好。更好的是当(!z)@DasWood在
catch(Exception e){}
部分中,确保编写
e.printStackTrace()
。在不报告错误的情况下接受异常通常是非常糟糕的。堆栈跟踪将为您提供发生故障的行号。我认为您不需要在这里打印堆栈跟踪,因为这里的异常不是“异常”,而是一种分支程序逻辑的方法。更好的方法是根据我下面的答案设置一个finally块(我认为)。这个代码没有什么意义。没有声明变量catcher,而且在循环中肯定没有更改。也许你抄错了?对于这样的问题,最好尽可能多地发布一个小型的自包含的可编译程序。这一行应该是while(z==false)???我猜是的,但即使这样也不好。更好的是当(!z)@DasWood在
catch(Exception e){}
部分中,确保编写
e.printStackTrace()
。在不报告错误的情况下接受异常通常是非常糟糕的。堆栈跟踪将为您提供发生故障的行号。我认为您不需要在这里打印堆栈跟踪,因为这里的异常不是“异常”,而是一种分支程序逻辑的方法。更好的方法是根据我下面的回答,最后一个街区(我想是这样)。谢谢。这台机器终于运转得很好了。那就是我想的!z和z==false是同一件事?他们是,但大多数人都这么认为!z更干净。同样,在if条件实际设置布尔值的情况下,您不会遇到有害的if(z=false)错误。赋值错误不会在Java中发生,因为赋值不会计算为任何值这不是一个有效的表达式,这是C、C++和其他语言的问题。马塞洛,请看我上面的文章的编辑。谢谢你给我的任何建议和见解。我还在学习这伟大的语言。谢谢。终于完成了。我想,Z和Z= = FALSE是一样的,但大多数人感觉到了。at!z更干净。而且,在if条件实际设置布尔值的情况下,您不会遇到有害的if(z=false)错误。赋值错误不会在Java中发生,因为赋值不会计算为任何值它们不是有效的表达式,这是C、C++和其他语言的问题。马塞洛,请参阅以上文章的编辑。谢谢你给我的任何建议和见解。我还在学习这门伟大的语言。