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

回到顶部