【问题标题】:Why is input.next() sometimes being skipped?为什么 input.next() 有时会被跳过?
【发布时间】:2015-07-05 23:52:49
【问题描述】:

在我的代码(如下)中,input.next(); 只是被跳过了。有人能指出原因吗?

for (int i=0; i<empNum; i++)//for each employee they want to work with
    {
        System.out.print("\r\n\r\nPROFILE FOR EMPLOYEE #" + (i+1) + ":\r\n"
                        +"type Hourly(1), Salaried(2), Salaried plus Commission(3)\r\n"
                        +"Enter 1, 2, or 3 ==> ");//display type gathering
        int typeChooser = input.nextInt();//gather type

        System.out.print("Name ==> ");//ask for name
        String name = input.next();//get name

        System.out.print("Social Security Number ==> ");//ask for ssn
        String ssn = input.next();//THIS PART IS SKIPPED

        System.out.print("Birthday Month (1-12) ==> ");//ask for bdayMonth
        int bdayMonth = input.nextInt();//get bdayMonth

        System.out.print("Birthday bonus week (1-4) ==> ");//ask for bdayWeek
        int bdayWeek = input.nextInt();//get bdayWeek            
}

编辑:我只是注意到它被跳过的唯一时间是名称中有空格(即 Bob Smith 而不是 Bob)

【问题讨论】:

  • 是否在某个时候遇到异常?
  • 我在我的电脑上运行了代码,它工作得很好......“跳过”是什么意思?
  • 很多很多行之后,我得到“线程'main'java.util.InputMismatchException中的异常”。我认为这无关紧要,但如果您认为它很快就会到来,也许不是?
  • @Michael 尝试在名字中使用空格来运行它。

标签: java loops iterator


【解决方案1】:

社会安全号码是否包含空格?如果是这样,您可以尝试 nextLine(); 方法。此方法返回当前行的其余部分,不包括末尾的任何行分隔符。

System.out.print("Social Security Number ==> ");//ask for ssn
String ssn = input.nextLine();

【讨论】:

  • 我不知道 nextLine();占线的其余部分-我认为,顾名思义,它占用了整个下一行。这就是答案,我会尽可能地标记它。谢谢!
  • 由于之前对input.next()的调用,此答案将不起作用
【解决方案2】:

我假设您为此使用 Scanner。默认情况下,扫描仪使用空格作为分隔符,因此next() 方法只会读取到下一个空格,而不是结束行字符。所以如果输入中有空格,应该改​​用nextLine()方法。

【讨论】:

    【解决方案3】:

    从 Umut 的回答中,您的代码看起来像

     input.nextLine();
     System.out.print("Social Security Number ==> ");//ask for ssn
     String ssn = input.nextLine();
    

    您需要先调用nextLine(),因为input.next() 不会超过换行符

    【讨论】:

      【解决方案4】:

      如文档here中所述

      公共字符串 next()

      从 这个扫描仪。一个完整的令牌之前和之后是输入 匹配分隔符模式。此方法可能会在等待时阻塞 扫描的输入,即使之前调用 hasNext() 返回 真的。

      因此,当您的名称输入中有空格时,next() 仅返回第一个标记,因为它的默认分隔符是空格字符,因此剩余的标记仍然在缓冲区中,然后读取首先是对 next() 的以下调用。在此处使用 nextLine() 来吃掉整行(默认分隔符是 '\n'),或者您可以更喜欢使用 BufferedReader。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2021-11-07
        • 1970-01-01
        • 2020-01-28
        • 2021-03-19
        • 2015-05-06
        • 2014-05-28
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多