关于Java中Scanner缓冲区问题

我有一个 java 代码,我想从用户那里获取一个整数。如果该输入确实是一个整数,那么它接下来将通过控件进行扫描,但如果输入不是整数,则控件将再次进行扫描。问题是当用户给出的不是整数时,while 循环一次又一次地循环。比如,

public static void main(String[] args) {
    Scanner sc = new Scanner(System.in);
    boolean isValid = true;
    while (isValid) {
        try{
            System.out.print("Please enter any int:");
            int a = sc.nextInt();
            isValid = false;
        }catch(Exception e){
            System.out.println("ERROR : Didn't enter any int");
        }
    }
    System.out.println("System running...");
}

若用户输入a则会导致

Please enter any int:ERROR : Didn't enter any int
Please enter any int:ERROR : Didn't enter any int
Please enter any int:ERROR : Didn't enter any int
Please enter any int:ERROR : Didn't enter any int
Please enter any int:ERROR : Didn't enter any int

...........

中,若用户输入字符串或其他非整型数据,此时程序会进入死循环,导致这样的原因为Scanner对象sc的缓存并未清理此时须将对象缓存清理释放。

可使用对象功能清理缓存区,如

sc.next();

此时代码块结构为

public static void main(String[] args) {
    Scanner sc = new Scanner(System.in);
    boolean isValid = true;
    while (isValid) {
        try{
            System.out.print("Please enter any int:");
            int a = sc.nextInt();
            isValid = false;
        }catch(Exception e){
            System.out.println("ERROR : Didn't enter any int");
            sc.next();
            //清理缓存区防止死循环
        }
    }
    System.out.println("System running...");
}

  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
Scanner类是Java的一个输入流类,用于读取用户从控制台输入的数据。它可以读取各种类型的数据,包括整数、浮点数、布尔值、字符串等。 使用Scanner类,需要先创建一个Scanner对象,然后调用其方法来读取输入的数据。以下是Scanner类的基本使用方法: 1. 导入Scanner类 ``` import java.util.Scanner; ``` 2. 创建Scanner对象 ``` Scanner scanner = new Scanner(System.in); ``` 3. 读取输入的数据 ``` int num = scanner.nextInt(); // 读取整数 double d = scanner.nextDouble(); // 读取浮点数 boolean b = scanner.nextBoolean(); // 读取布尔值 String str = scanner.nextLine(); // 读取字符串 ``` 在读取字符串时,需要注意一点:如果在读取其他类型的数据之后,再读取字符串,需要先调用nextLine()方法,以清除输入缓冲区的换行符,否则会直接读取到一个空字符串。 ``` int num = scanner.nextInt(); scanner.nextLine(); // 清除缓冲区的换行符 String str = scanner.nextLine(); ``` 完整示例代码: ```java import java.util.Scanner; public class ScannerDemo { public static void main(String[] args) { Scanner scanner = new Scanner(System.in); System.out.print("请输入整数:"); int num = scanner.nextInt(); System.out.println("您输入的整数是:" + num); System.out.print("请输入浮点数:"); double d = scanner.nextDouble(); System.out.println("您输入的浮点数是:" + d); System.out.print("请输入布尔值(true/false):"); boolean b = scanner.nextBoolean(); System.out.println("您输入的布尔值是:" + b); System.out.print("请输入字符串:"); scanner.nextLine(); // 清除缓冲区的换行符 String str = scanner.nextLine(); System.out.println("您输入的字符串是:" + str); } } ```

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值