我正在尝试运行一个简单的代码,该代码会使用 nextLong()
方法将用户帐号作为长类型。如果用户已经提供了account_number({{ 1}})作为string_type或character_type而不是long_type值,然后抛出 long accNo
。这也没关系,因为我知道InputMismatchException
)方法可以抛出 nextLong(
以及 InputMismatchException
和 NoSuchElementException
。但之后我期待之后获取IllegalStateException
循环将重新访问并要求我再次给出account_number(InputMismatchException
)长值!然后问题就出现了。它不是要求我给出任何值,而是一个无限循环再次与异常一起运行&试。!!
long accNo
为什么会这样? package genericsandcollection;
import java.util.*;
public class ScannerTest {
public static void main(String[] args) {
// TODO Auto-generated method stub
Scanner sc=new Scanner(System.in);
boolean b=true;
while(b){
try{
System.out.println("Enter Your Account Number..: ");
long accNo=sc.nextLong();
System.out.println(accNo);
b=false;
}catch(InputMismatchException | IllegalStateException e){
e.printStackTrace();
System.out.println(e);
System.out.println("Wrong syntax");
}
}
}
}
不够聪明,无法处理循环内的情况!如果我使用nextLong()
代替Long.parseLong(sc.next())
,那么一切都会正常,因为sc.nextLong()
正在抛出parseLong()
,即直到我将帐号作为long_type,它一直要求用户提供account_number为long_type值。真是奇怪!!!!如果有人有任何疑虑,请帮助。谢谢。
答案 0 :(得分:3)
请勿关闭挡块中的扫描仪,否则将无法再次使用它。
答案 1 :(得分:0)
您不应该关闭扫描仪,因为除了意味着您不能再使用扫描仪,它也会关闭System.in
。你的无限循环是因为使用除nextLine
之外的任何其他方法将在输入缓冲区的末尾留下换行符(从按下'enter'进行提交)。这将导致nextLong始终抛出异常。
调用nextLine将推进扫描程序。以下是一个简短的示例,显示了这一点(改编自a very similar answer I wrote)。
do {
try {
accNo = sc.nextLong();
break;
} catch (InputMismatchException e) {
} finally {
sc.nextLine(); // always advances (even after the break)
}
System.out.print("Input must be a number: ");
} while (true);