System.in.read()之后,扫描程序nextLine()无法正常工作

时间:2014-08-16 04:54:43

标签: java

我有以下代码,如果我在System.in.read()之前使用Scanner,则会遇到问题 然后通过跳过nextLine()函数,光标在末尾移动。

import java.util.Scanner;
public class InvoiceTest{
public static void main(String [] args) throws java.io.IOException {
    System.out.println("Enter a Charater: ");
    char c = (char) System.in.read();

    Scanner input = new Scanner(System.in);
    System.out.println("Enter id No...");
    String id_no = input.nextLine();

    System.out.println("Charater You entered "+ c +" Id No Entered "+ id_no);

    }
}

2 个答案:

答案 0 :(得分:2)

在输入角色(System.in.read())时,您没有使用换行符,因此input.nextLine()将使用它并跳过它。

<强>溶液

在读取id的输入之前先消耗新行字符。

System.out.println("Enter a Charater: ");
    char c = (char) System.in.read();

    Scanner input = new Scanner(System.in);
    System.out.println("Enter id No...");
    input.nextLine(); //will consume the new line character spit by System.in.read()
    String id_no = input.nextLine();

    System.out.println("Charater You entered "+c+" Id No Entered "+id_no);

    }

答案 1 :(得分:1)

EJP评论如此:

  

不要将System.in.read()与新的Scanner(System.in)混合使用。使用其中一个。

好建议!

  

那么为什么在流中混合阅读并使用Scanner是一个坏主意?

好吧,因为Scanner操作通常会在输入流上提前读取,将未使用的字符保留在内部缓冲区中。因此,如果您通过调用流上的Scanner执行read()操作后跟,则read()很可能会(实际上)跳过超过人物。这种行为可能会令人困惑和不可预测......并且取决于输入字符实际来自何处。