Scanner类
方法分类:
1.next系列 next nextInt nextDouble…
2.nextLine
next系列的扫描开始是第一个不为空格/制表/换行的字符,结束同理
nextLine的扫描开始是任意字符,结束为换行
举个next系列的例子:
//在第一次输入 “ 100 200” + 回车
System.out.println("请输入数字");
num = scanner.nextInt();
System.out.println("请输入数字");
num2 = scanner.nextInt();
System.out.println(num); //100
System.out.println(num2); //200
/*
此时虽然我们在第一次输入就写了200,但是在100后有空格所以视为第一次输入已经结束
而第二个数字仍然可以接收200,原因可能是因为输入时一次性输入的内容放在缓冲区
然后每次的方法按照扫描开始和结束的标志获取内容
*/
根据两种Scanner的方法的特点,需要特别注意一点,就是当两种方法混用时会出现错误,如下:
//输入 “100” + 回车
System.out.println("请输入数字");
num = scanner.nextInt();
System.out.println("请输入字符串");
str = scanner.nextLine();
System.out.println(num); //100
System.out.println(str); //""
System.out.println(str.length()); //0
/*
此时换行是第一次输入的结束标志,但是同时也变成了第二次字符串输入的结束标志
字符串没有如何输入直接结束,为空字符串,长度为0,存储编码值为0
原因:当第一次输入读取时读取到回车结束,结束的地方在回车前,那么第二次输出读取就是从回车开始
*/
为了避免产生这种现象,考虑以下几种办法:
//1 加一句 nextLine 吸收换行
...
num = scanner.nextInt();
scanner.nextLine();
...
str = scanner.nextLine();
/*可以正常使用,轻微增加代码量*/
//2 交换两种方法的位置
...
str = scanner.nextLine();
...
num = scanner.nextInt();
/*给输入增加了限制 使用不方便*/
//3 第一次输入用空格结束
//输入“100 abc” + 回车
...
num = scanner.nextInt();
...
str = scanner.nextLine();
/*
结果为 100 和 “ abc",明显接收了多余的空格,与预期不符合
如果使用其他字符串的方法消除空格,则增加了代码量
原因:nextInt读到第一个空格结束,读取停在第一个空格前,nextLine读取则从这个空格开始
*/
//4 使用两个对象
...
num = scanner.nextInt();
...
str = scanner2.nextLine();
/*
可以正常使用,但是会浪费空间
前面提到猜测Scanner对象会有一个输入读取的缓冲区
所以使用不同的对象两次输入就不会读取同一个回车
*/
其实以上4种办法因为种种原因都不适合做为最终解决方案,要从根本上解决问题应该避免混合使用,当需要输入多种数据类型时,最可靠的是只使用 nextLine,
//使用包装类 Datatype.parseDatatype 将字符串转换成数值
strNum = scanner.nextLine();
intNum = Integer.parseInt(strNum);
doubleNum = Double.parseDouble(strNum);
...