java.util.Scanner类中的nextLong()方法令人困惑的问题

时间:2013-12-19 16:07:58

标签: java java-7 java.util.scanner

我正在尝试运行一个简单的代码,该代码会使用 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值。真是奇怪!!!!如果有人有任何疑虑,请帮助。谢谢。

2 个答案:

答案 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);