Java,程序不会停止进行scan.nextLine()
当我运行以下代码时,它停下来让我输入服务器名和它们的端口号,此后应该停下来让我输入用户名,但它永远不会暂停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
,则可以向用户咆哮说输入已被插入。
之所以需要这样做,是因为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);
输入:
Enter port number: 123 abc
Enter your username:
将输出
serverPort: 123 userName: abc
这是因为该空格充当令牌分隔符,并且在scan.nextInt()
调用后,空格和abc
仍保留在缓冲区中。当随后scan.nextLine()
被调用时,空间和abc
从缓冲器扫描。
以上是 Java,程序不会停止进行scan.nextLine() 的全部内容, 来源链接: utcz.com/qa/410402.html