当我运行下面的代码时,它会停下来让我输入服务器名和它们的端口号,然后它应该会停下来让我输入用户名,但它从来不会停下来等待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();
}发布于 2010-02-16 04:10:30
我将再次使用scan.nextLine()而不是scan.nextInt(),然后解析输入。如果你得到了一个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。
https://stackoverflow.com/questions/2268598
复制相似问题