当我运行以下代码时,它停止让我输入服务器名和端口号,之后它应该停止并让我输入用户名,但它从不暂停 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)
而不是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
会从缓冲区中扫描空间和。
归档时间: |
|
查看次数: |
3890 次 |
最近记录: |