使用扫描仪时无限循环?

1 java infinite-loop while-loop java.util.scanner

boolean z = false;
do {
    try {
        a = sc.nextInt();
        z = true;
    }
    catch(Exception e) {
    }
}
while(!z);
Run Code Online (Sandbox Code Playgroud)

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

Hov*_*els 8

您的问题是没有处理行尾令牌,因此扫描仪处于悬空状态.你想做这样的事情:

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);
    }
}
Run Code Online (Sandbox Code Playgroud)

而且,虽然(z == false)是不好的形式.在(!z)时你会好多了.这可以防止while(z = false)错误,并且是一种更清晰的表达方式.

编辑马塞洛:

马塞洛,感谢您的意见和建议!你是说在下面的if块中的条件不会改变布尔值,垃圾邮件的值吗?

  boolean spam = true;

  if (spam = false) {
     System.out.println("spam = false");
  }

  System.out.printf("spam = %b%n", spam);
Run Code Online (Sandbox Code Playgroud)

因为如果它确实改变它,编码器就不会期望这个如果他们打算写if(spam == false),那么这可能会产生微妙和危险的副作用.再次感谢您帮我澄清这一点!