使用软件eclipse 2019-2版
jdk:11
首先明确一件事情,获取输入的这些Next可以分为两类,nextLine独占一类,因为它可以获取空格和回车,而其他的是不可以获取的。正因为这一点,所以在使用时不要在一个方法里同时使用这两类next
来看这样一个例子
很简单的一个代码就是用来获取输入,并把获取到的内容输出
Scanner input = new Scanner(System.in);
System.out.println("请输入:");
Object o1 = input.next();
Object o2 = input.nextLine();
System.out.println(o1);
这里输入:哈哈,输出结果为:哈哈
明明有两个获取输入的变量,但是只输入了一次代码就结束了,原因是next不会接收用户输入的回车以及空格,但是我们在输入时总要敲回车来告诉计算机我已经输入完毕了,这就导致了next获取到数据后,我们敲进去的那个回车给到了o2,所以只进行了一次输入代码便结束了。
将next与nextLine交换顺序后,就可以正常的获取输入了
Scanner input = new Scanner(System.in);
System.out.println("请输入:");
Object o2 = input.nextLine();
Object o1 = input.next();
System.out.println(o1);
关于next还有一点,它不会接收空格和回车,比如说输入了:1234 3 21这样的数据,他只会接收到第一个空格前面的数据,而剩下的那些还在内存里,而这时用了nextLine的话就会把第一个空格以及它后面一整行的所有内容给获取。
在Scanner类里面,还有一些常用方法,比如判断输入的内容是否为指定的类型
hasNextInt(),hasNextBoolean().......等,在hasNext后加上所要指定的类型就可以,这些方法返回的是一个boolean类型的值,如果输入符合指定类型返回true,反之false
例: Scanner input = new Scanner(System.in);
System.out.println("请输入:");
if (input.hasNextInt()) {
int x = input.nextInt();
System.out.println("你输入了:"+x);
}else {
System.out.println("请输入数字");
}
如果输入的不是数字,就会提示“请输入数字”,而如果输入的是数字,则会直接把输入的数字赋值给x
但如果在判断符合要求后,用了不兼容的类型去接收,就好比判断的是int,在后面却用了boolean接收就会异常错误类型为输入不匹配异常。如果用float接收,就会把int类型转成浮点类型输出
根据上面这个例子,我们就可以写一个简单的程序:获取我们指定类型的数据
比如说我现在想要获取数字,我就可以这么写。
Scanner input = new Scanner(System.in);
System.out.println("请输入一个数字:");
while(true) {
if (input.hasNextInt()) {
float x = input.nextFloat();
System.out.println("你输入了:"+x);
}else {
String trash = input.next();
System.out.println("请输入数字");
}
}
有一点必须要注意:在else的代码块里一定一定一定要用一个变量来把hasNextInt中输入的内容接一下,不然就会死循环,一直输出请输入数字。
如果在接收不是指定类型的数据时,用了nextLine,会产生一个小bug,产生的操作条件是输入一个指定类型后,又输入了一个其他类型,这时候就会连续执行else代码块里的提示两次,原因是在输入指定类型后,敲的回车没有被接受,这个时候在输入一个其他类型,就会把先前没被接收的回车判断一次,然后再把后面输入的数据判断一次,因为两次都不符合要求,所以就执行了两次else代码块。
所以在使用这些Next时,用了nextLine就不要用next
推荐在接收用户输入时,统一使用nextLine。用字符串类型去接收,在接收完毕后转换类型即可。转换中会出现各种格式化错误,捕获以后重新输入即可。
因为在转换的时候可能会出现异常,所以对这个异常进行一个捕获,捕获到了之后,提示用户重新输入即可
Scanner input = new Scanner(System.in);
System.out.println("请输入一个数字:");
String num;
while(true) {
num = input.nextLine();
try {
int number = Integer.parseInt(num);
System.out.println("你输入了:"+number);
} catch (NumberFormatException nfe) {
System.out.println("请输入数字");
}
}
这样做的好处是:避免了nextLine和next的混用,使得程序更加可靠
以上如有问题,请在评论区指出