java,程序不会停止 scan.nextLine()

n0o*_*0ob 2 java

当我运行以下代码时,它停止让我输入服务器名和端口号,之后它应该停止并让我输入用户名,但它从不暂停 scan.nextline() 并直接输入接收者名称?

public static void main(String[] args) throws IOException {
    try {
        System.out.println("\n\n\nTCP Chat Client\n\nEnter server name:");
        Scanner scan = new Scanner(System.in);

        //get server info from user
        serverName = scan.nextLine();

        System.out.println("\nEnter port number:");
        serverPort = scan.nextInt();


        System.out.println("Enter your username:\n");
        userName = scan.nextLine();

        //make connection to server
        cSocket = new Socket(serverName, serverPort);
        out = new PrintWriter(cSocket.getOutputStream(), true);
        in = new BufferedReader(new InputStreamReader(cSocket.getInputStream()));

        //send username to server
        out.println(userName);
        String rcvrname="wefwef";
        String message=null;
        //start messaging
        while(!(rcvrname.equals("exit"))){
            System.out.println("Enter reciever name");
            out.println(scan.nextLine());
            System.out.println("Enter message");
            out.println(scan.nextLine());

        }
        out.close();
        in.close();
        cSocket.close();

    }
Run Code Online (Sandbox Code Playgroud)

akf*_*akf 5

而不是scan.nextInt(),我会scan.nextLine()再次使用,然后解析输入。如果你得到一个NumberFormatException,你可以向用户咆哮说输入是无效的。

你需要做这样的事情的原因是你的 serverPort 输入的末尾仍然有一个换行符。当您使用 时nextInt(),扫描器会抓取所有下一个标记并尝试将其转换为Integer. Integer 标记之后的任何内容都需要扫描。

为了证明这一点,用你的原始代码,如果你在你的服务器端口输入后放一个标记分隔符,比如一个空格,然后添加一些文本,你会发现你的后续userName分配将从数字的末尾抓取到下一个换行符.

    System.out.println("\nEnter port number:");
    Integer serverPort = scan.nextInt();
    System.out.println("\nEnter your username:");
    String userName = scan.nextLine();

    System.out.println("\nserverPort: " + serverPort 
                     + "\nuserName: " + userName);
Run Code Online (Sandbox Code Playgroud)

输入:

    Enter port number: 
    123 abc
    Enter your username:
Run Code Online (Sandbox Code Playgroud)

会输出

   serverPort: 123
   userName:  abc
Run Code Online (Sandbox Code Playgroud)

这是因为空格充当了标记分隔符,并且在scan.nextInt()调用之后,空格和 theabc仍然留在缓冲区中。scan.nextLine()调用后续时,abc会从缓冲区中扫描空间和。

  • 因为在扫描器获得整数后,它会停在那里 - 留下用户在输入 int 后按下的换行符仍然可以读取。然后,当您调用 `nextLine()` 时,它会继续扫描流,找到该换行符,然后停止。 (2认同)