java,程序未停止扫描。nextLine()

java,程序未停止扫描。nextLine(),java,Java,当我运行下面的代码时,它会停下来让我输入servername和端口号,之后它应该停下来让我输入username,但它不会停下来进行扫描。nextline并直接飞行以输入receiver name public static void main(String[] args) throws IOException { try { System.out.println("\n\n\nTCP Chat Client\n\nEnter server name:");

当我运行下面的代码时,它会停下来让我输入servername和端口号,之后它应该停下来让我输入username,但它不会停下来进行扫描。nextline并直接飞行以输入receiver name

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();

    }
我不再使用scan.nextLine,而是再次使用scan.nextLine,然后解析输入。如果你得到一个NumberFormatException,你可以对用户咆哮,说输入被篡改了

之所以需要这样做,是因为在serverPort输入的末尾仍然有一个换行符。当您使用nextInt时,扫描器将获取所有下一个令牌并尝试将其转换为整数。整数标记之后的任何内容都将被扫描

为了证明这一点,使用原始代码,如果您在服务器端口输入后放置一个令牌分隔符(如空格),然后添加一些文本,您将发现后续的用户名分配将从数字的末尾抓取到下一个换行符

    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);
输入:

    Enter port number: 
    123 abc
    Enter your username:
将输出

   serverPort: 123
   userName:  abc

这是因为该空间用作令牌分隔符,在调用scan.nextInt后,该空间和abc仍保留在缓冲区中。当调用后续的scan.nextLine时,将从缓冲区扫描空格和abc。

因为在扫描仪获取整数后,它会停止在那里-留下用户在键入int后按下的换行符仍在那里等待读取。然后,当您调用nextLine时,它会继续扫描流,找到新行并停止。