public static void main(String[] args) {
Scanner scanner=new Scanner(System.in);
int i=0;
while (true){
System.out.println("请输入一个整数:");
try {
i=scanner.nextInt();
}catch (Exception e){
System.out.println("你应该输入一个整数");
}
}
}
在上面的语句中,当我们输入一个字符的时候它会循环打印“请输入一个整数:”和“你应该输入一个整数”。造成这样的原因是因为我们用sc.nextInt()调用没把该段内存中的东西提出来,他就会一直占用这段内存,导致我们二次输入时,就不会再要求用户输入了,他会继续试图调用该段内存数值。解决办法:可以把该段内存中的数值取出。在catch语句块中使用scanner.next();
代码如下:
public static void main(String[] args) {
Scanner scanner=new Scanner(System.in);
int i=0;
while (true){
System.out.println("请输入一个整数:");
try {
i=scanner.nextInt();
}catch (Exception e){
scanner.next();
System.out.println("你应该输入一个整数");
}
}
}
还有就是当你有多个Scanner对象时,如果调用了Scanner的close()的话它会将所有的Scanner对象都关闭。如下:
public class Test1 {
Scanner scanner=new Scanner(System.in);
public void f(){
scanner.close();
}
}
public class Test2 {
public static void main(String[] args) {
Scanner scanner=new Scanner(System.in);
Test1 test1=new Test1();
test1.f();
System.out.println("请输入你的姓名:");
//将会抛出异常,就算你是在另一个类中关闭的Scanner
//它会提示你:NoSuchElementException(没有这样的元素)
//就算重新new一个Scanner对象也无济于事
String name=scanner.next();
}
}
可以验证上面的结论:
在test2中我们将test1中f()的调用注释掉换成scanner.close(),就会发现系统抛出的异常和上面一样
这是因为System.in的这个流被关闭了,这个流只有一个,这也是为什么在Test1中代用close方法而test2中也不能用了。
public class Test2 {
public static void main(String[] args) {
Scanner scanner=new Scanner(System.in);
// Test1 test1=new Test1();
// test1.f();
scanner.close();
System.out.println("请输入你的姓名:");
//将会抛出异常,就算你是在另一个类中关闭的Scanner
//它会提示你:NoSuchElementException(没有这样的元素)
//就算重新new一个Scanner对象也无济于事
String name=scanner.next();
}
}