当我第一个输入10.1的时候,第二个输入就会不被执行,直接将10.1输进第二个scanner了,而且第一个10.1不是局部变量吗?为什么可以转到第二个scanner上?
import java.util.Scanner;
public class Java1 {
public static void main(String[] args) {
Scanner scanner=new Scanner(System.in);
int str=0;
float str1=0.0f;
System.out.println("请输入一个整数:");
if(scanner.hasNextInt()){
str=scanner.nextInt();
System.out.println("输入的整数为:"+str);
}else {
System.out.println("不是整数");
}
System.out.println("请输入小数");
if(scanner.hasNextFloat()){
str1= scanner.nextFloat();
System.out.println("输入的小数为"+str1);
}else {
System.out.println("输入的不是小数");
}
}
}
运行结果10.1
不是整数
请输入小数
输入的小数为10.1
因为当你首先输入10.1时,第一个if判断到不是整数,所以执行else部分,然后执行下面的语句,
然后因为前面只执行了if部分不满足,所以输入的数10.1还在,到第二个fi判断时if条件成立,scanner读取这个小数到str1,所以输出读到的小数。
问题的关键在于hasNext()和hasNextFloat()进行了输入类型的判断,如果满足则执行if里的读取操作,如果不满足类型则执行else部分。
这个10.1是存在于输入流里,如果输入流有数据,则可以用相应方法读取到里面的数据。
而str1和str在main方法里到处都可以访问到。
public static void main(String[] args) {
Scanner scanner=new Scanner(System.in);
int str=0;
float str1=0.0f;
System.out.println("请输入一个整数:");
if(scanner.hasNextInt()){
str=scanner.nextInt();
System.out.println("输入的整数为:"+str);
}else {
//在else 中将数据消费掉 下面的就会阻塞 输入数据
System.out.println("不是整数"+scanner.next());
}
System.out.println("请输入小数");
if(scanner.hasNextFloat()){
str1= scanner.nextFloat();
System.out.println("输入的小数为"+str1);
}else {
System.out.println("输入的不是小数");
}
}
键盘输入10.1,它先是一个输入流。Scanner scanner=new Scanner(System.in)意味着scanner可以读取标准输入流中的数据。if(scanner.hasNextInt()),scanner.hasNextInt()判断可不可以读出int类型的数,结果是不可以,因此返回false执行else中的语句,此时键盘标准输入流并没有被读取,还在缓冲区中。这时,if(scanner.hasNextFloat())判断标准输入流中可以读取float小数,因此执行该if语句中的内容,str1= scanner.nextFloat();读取输入流中小数。
注意:scanner.hasNextInt()和scanner.hasNextFloat()不会读取流中数据(只是判断可不可以读取),流不变。而str=scanner.nextInt()和str1= scanner.nextFloat()可以读取流中的数据进而改变流。
1.关于局部变量问题,你存放的输入在Scanner类中且只声明了一次,他在你的两个if判断之前。不是某一个if类的局部变量,不存在流转问题。
2.程序正常判断不是int输出float。