一般情况下,在输入之前最好先使用 hasNextXxx() 方法进行验证,再使用 nextXxx() 来读
import java.util.Scanner; public class test { public static void main(String[] args) { Scanner scanner=new Scanner(System.in); //整数 System.out.println("请输入一个整数"); int a=scanner.nextInt(); System.out.println(a); //单精度小数 System.out.println("请输入一个单精度小数"); float f=scanner.nextFloat(); System.out.println(f); //双精度小数 System.out.println("请输入一个双精度小鼠"); double d=scanner.nextDouble(); System.out.println(d); scanner.close(); } }
System.out.println("请使用next()输入一个字符串"); String s=scanner.next(); System.out.println(s); //字符串 System.out.println("请使用nextLine()输入一个字符串"); String s1=scanner.nextLine(); System.out.println(s1); System.out.println("注意next()和nextLine()的不同");
根据上述代码运行结果得知
String s1=scanner.nextLine();并没有运行
出现错误,原因如下:Scanner是一个扫描器,它扫描数据都是去内存中一块缓冲区中进行扫描并读入数据的,而我们在控制台中输入的数据也都是被先存入缓冲区中等待扫描器的扫描读取。这个扫描器在扫描过程中判断停止的依据就是“空白符”,空格啊,回车啊什么的都算做是空白符。
next()方法在扫描到空白符的时候会将前面的数据读取走,但会丢下空白符“\r”在缓冲区中,但是,nextLine()方法在扫描的时候会将扫描到的空白符一同清理掉。
了解了这两个方法特性和区别,就知道了上边的代码究竟是怎么回事,以及知道了解决的方法。像是上边的代码next()方法之后在缓冲区中留下了“\r”,然后nextLine()方法再去缓冲区找数据的时候首先看到了“\r”,然后就把这个“\r”扫描接收进来,并在缓冲区内清除掉。其实,nextLine()方法是执行过的,并没有不执行。修改如下:
System.out.println("请使用next()输入一个字符串"); String s=scanner.next(); scanner.nextLine(); System.out.println("请使用nextLine()输入一个字符串"); String s1=scanner.nextLine(); System.out.println(s); System.out.println(s1); System.out.println("注意next()和nextLine()的不同");
next():
1、一定要读取到有效字符后才可以结束输入。
2、对输入有效字符之前遇到的空白,next() 方法会自动将其去掉。
3、只有输入有效字符后才将其后面输入的空白作为分隔符或者结束符。
next() 不能得到带有空格的字符串。
nextLine():
1、以Enter为结束符,也就是说 nextLine()方法返回的是输入回车之前的所有字符。
2、可以获得空白。
在使用完Scanner类后要在最后写上 scanner.close
因为Scanner.close()方法的作用是关闭输入的流,释放内存。Scanner 类实例化的时候需要一个InputStream流作为参数,Scanner的close就是关闭InputStream流的,一般是IO流或scanner方法使用完后就可以调用close()方法释放内存了,如果你是小程序可以不用使用.close方法,这个不影响,但如果项目很大的时候就肯定要用了,所以建议养成良好的习惯