一、前言
今天在复习Java基础知识部分时,看到了Scanner
类,之前我只知道next()方法与nextLine()方法都是接受键盘输入的字符串进行返回的,也并没有去深深地看,于是今天趁着复习多注意了一眼,结果遇到了一个问题,如下
可以看到,next()方法执行后,其下面的nextLine()方法还没有接收我的输入,程序直接就结束了。
二、nextLine()方法与next()、nextInt()方法...
要解决这个问题得了解下nextLine()方法与next()、nextInt()方法等等方法之间关于扫描的区别,我们知道nextLine()方法与next()方法都是接受键盘输入字符串的,他们的机制是Scanner扫描器进入内存的一块缓冲区去获取数据的,从第一个非结束符【空格、回车、Tab键...】开始扫描,而区别在于
- nextLine()方法是读取一整行,以一个回车符作为结束标记停止扫描
- next() / nextInt() / nextDouble()等方法是,读取到第一个结束符【空格、回车、Tab键】作为结束标记停止扫描
next() / nextInt() / nextDouble()他们不会取走结束符号,把他们留在缓冲区;而nextLine()方***取走当前扫描行第一个非结束符之后、回车符之前的整行内容作为字符串进行返回,也就是可能会取走空格等,遇到回车结束【并不会取走回车】
如下:
Scanner sc1 = new Scanner(System.in); System.out.println("nextLine()方法输入:"); String s1 = sc1.nextLine(); System.out.println("next()方法输入:"); String s2 = sc1.next(); System.out.println("nextLine()结果:" + s1 + "\nnextLine()结果:" + s2);
所以最开始的代码中,先执行了Scanner的next()方法,其读到了内存缓冲区的回车符,结束扫描返回结果。然后nextLine()方法开始扫描的时候,它会优先读到残留在缓冲区的回车符,进而直接结束扫描,返回,自然我就没办法输入我的数据了
三、解决办法
要解决这个问题,最简单的方法有两个
一、如果没必要读取空格的话,就不使用nextLine()方法,使用next()方法读取一个连续不间断的字符串
Scanner sc1 = new Scanner(System.in); System.out.println("nextInt()方法接收一个整数:"); int number = sc1.nextInt(); System.out.println("next()方法接收一个不含空格的字符串:"); String s2 = sc1.next(); System.out.println("nextInt()结果:" + number + "\nnextLine()结果:" + s2);
二、有必要读取空格的话,使用nextLine()方法接收你想输入的字符串之前,额外执行一次nextLine()方法把残留的回车符拿掉,这样再执行nextLine()方法就可以正常地输入并接收自己想要输入的数据了
Scanner sc1 = new Scanner(System.in); System.out.println("nextInt()方法接收一个整数:"); int number = sc1.nextInt(); //提前执行一个nextLine()方法把回车吞掉 String temp = sc1.nextLine(); System.out.println("nextLine()方法接收一个可以包含空格的字符串:"); String s2 = sc1.nextLine(); System.out.println("nextInt()结果:" + number + "\nnextLine()结果:" + s2);
三、当然还有其他的方案,这里就不再向下了