java,programm没有为scan.nextLine()停止

当我运行以下代码时,它停止让我输入servername和它们的端口号,之后它应该停止并让我输入用户名但它永远不会暂停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(); } 

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

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

为了certificate这一点,使用原始代码,如果在服务器端口输入之后放置一个标记分隔符(如空格),然后添加一些文本,您会发现随后的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); 

输入:

  Enter port number: 123 abc Enter your username: 

将输出

  serverPort: 123 userName: abc 

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