用户交互Scanner

Scanner对象

Java给我们提供了这样一个工具类,我们可以获取用户的输入。
创建 Scanner 对象的基本语法:

Scanner s = new Scanner(System.in);

next & nextLine

在数据输入中,通过Scanner类的next()与nextLine()方法获取输入的字符串,在读取前一般需要使用hasNext()与hasNextLine()判断是否还有输入的数据

使用next方式接收输入的数据

package Demo;

import java.util.Scanner; //导入Scanner类

public class Hello {
    public static void main(String[] args) {
    //创建一个扫描器对象,用于接收键盘数据
        Scanner scanner = new Scanner(System.in);
        System.out.println("请输入数据");

        //判断用户有没有输入数据
        if (scanner.hasNext()){ //用next方式接收
            String str = scanner.next();
            System.out.println("输入的内容为:"+str);
            
            scanner.close(); //IO流的类用完即时以关掉节省资源
        }
    }
}


测试数据:Hello World!
结果:只输出了Hello

使用nextLine()方式接收输入的数据

public static void main(String[] args) {
    //创建一个扫描器对象,用于接收键盘数据
        Scanner scanner = new Scanner(System.in);
        System.out.println("请输入数据");

        //判断用户有没有输入数据
        if (scanner.hasNextLine()){ //用next方式接收
            String str = scanner.nextLine();
            System.out.println("输入的内容为:"+str);

            scanner.close(); //IO流的类用完即时以关掉节省资源
        }
    }


测试数据:Hello World
结果:输出了Hello World

区别

next():

  • 对输入有效字符之前遇到的空白,next() 方法会自动将其去掉。
  • 输入有效字符后next() 方法会将其后面输入的空白作为结束符。
  • 按下回车键后会保留回车符nextInt、Double、Float等系列(统称nextXxx()),hasNextXxx()也是

nextLine():

  • 以Enter为结束符,也就是说nextLine()方法返回的是输入回车之前的所有字符。按下回车键后会吃掉回车符
  • 可以获得空白。
  • 适用于nextXxxLine()

hasNextXxxx():

  • 检测接下来是否还有非空字符为主,如果有则返回true,否则false

hasNextXxxLine():

  • 判断接下来是否还有一行(\n、空行也被当作一行),如果有则返回true,反之返回false

使用其他方式接收输入的数据

如果要输入 int 或 float 类型的数据,在 Scanner 类中也有支持,但是在输入之前最好先使用
hasNextXxx() 方法进行验证,再使用 nextXxx() 来读取:

package Demo;
import java.util.Scanner; //导入Scanner类

public class Hello {
    public static void main(String[] args) {
        Scanner scan = new Scanner(System.in);
    // 从键盘接收数据
        int i = 0;
        float f = 0.0f;
        System.out.print("输入整数:");
        if (scan.hasNextInt()) { //与next()的区别:nextInt()只读取数值
    // 判断输入的是否是整数
            i = scan.nextInt();
    // 接收整数
            System.out.println("整数数据:" + i);
        } else {
    // 输入错误的信息
            System.out.println("输入的不是整数!");
        }

        System.out.print("输入小数:");
        if (scan.hasNextFloat()) {
    // 判断输入的是否是小数
            f = scan.nextFloat();
    // 接收小数
            System.out.println("小数数据:" + f);
        } else {
    // 输入错误的信息
            System.out.println("输入的不是小数!");
        }
        scan.close();
    }
} 


但是程序是存在bug的,如果第一个数据先输入小数,如1.1,就会显示不是整数但也无法输入第二个数据。

解决方法:要在两个scan方法中插入scan.NextLine()方法
原因*:hasNextInt()不会吸收回车符,回车符会保留下来。hasNextFloat读取到回车符就会结束语句,所以输不了第二个数据。
但nextXxx()方法会先从扫描器当前行的缓存中看看有没有值,如果有就直接获取,没有再要求从控制台输入。
scan.hasNextInt()时就已经输入了数据并放入缓存,nextFloat方法在缓存中获取到1.1这个数据
目前该解释仍然片面,待改进。疑点:hasNextFloat接收到回车符后并没有返回false。难道hasNextXxx也会先从缓存中获取数据?

从图中佐证来看,应该是的。

还有1个bug,哪怕nextFloat()输入整数也会视为小数,如1会被视为1.0。hasNextFloat不能判断整数不是float类型,输入int类型会自动转换成float。
所以得换成其他方法判断是否为小数,可以用hasNextInt,也可以用contains(".")等方法

public static void main(String[] args) {
        Scanner scan = new Scanner(System.in);
        // 从键盘接收数据
        int i = 0;
        float f = 0.0f;
        System.out.print("输入整数:");
        if (scan.hasNextInt()) { //与next()的区别:nextInt()只读取数值
            // 判断输入的是否是整数
            i = scan.nextInt();
            // 接收整数
            System.out.println("整数数据:" + i);
        } else {
            // 输入错误的信息
            System.out.println("输入的不是整数!");
        }
        scan.nextLine();//将扫描器推进到下一行以达到吸收回车符的效果
        System.out.print("输入小数:");
        if (scan.hasNextFloat()) {
            // 判断输入的是否是小数
            f = scan.nextFloat();
            // 接收小数
            System.out.println("小数数据:" + f);
        } else {
            // 输入错误的信息
            System.out.println("输入的不是小数!");
        }
        scan.close();
    }

posted @ 2022-03-26 18:04  ben10044  阅读(39)  评论(0编辑  收藏  举报