当我运行以下代码时,它停下来让我输入服务器名和它们的端口号,此后应该停下来让我输入用户名,但它永远不会暂停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
从缓冲器扫描。
问题内容: 如何在Linux和Windows中正常停止Java进程? 什么时候被调用,什么时候不被调用? 终结器又如何呢? 我可以从外壳向Java进程发送某种信号吗? 我正在寻找最好的便携式解决方案。 问题答案: 在所有未强制终止VM的情况下,都会执行关机挂钩。因此,如果要发出“标准” kill(通过kill命令),则它们将执行。同样,它们将在调用后执行。 但是,如果将其强行杀死(),它们将不会执
问题内容: 我正在尝试使用Linux下的ProcessBuilder类将mp3文件解码为wav文件。由于某些原因,该过程不会停止,因此我必须手动取消它。 有人可以给我一个提示。我认为引用的代码很容易重现: jstack的输出 问题答案: 您需要清空进程的输出(通过)和错误(通过)流,否则可能会阻塞。 引用过程文档: 由于某些本机平台仅为标准输入和输出流提供有限的缓冲区大小,因此未能及时写入子流程的
我正在使用ProcessBuilder启动一个外部进程,但我需要能够杀死它。现在,我没有问题杀死进程,但由于某种原因,错误流没有关闭,所以读取流的线程永远不会完成。这让我无法关闭我的程序。 从这里开始线程读取输入和错误流。 这是我用来停止该进程的代码。 我从来没有得到“error end”,调试程序显示线程只是位于“readline()”。 等待进程的代码在它自己的线程中运行(与终止进程的代码分开
问题内容: 我的屏幕录制应用程序中有一个线程无法配合: 多年来一直困扰着我。它会定期将屏幕截图带到指定区域。 当您开始录制时,它会隐藏(缩小)窗口。在Mac上,当您以应用程序为焦点时,所有隐藏的窗口都会激活。在我的课程中(我已经确认可以工作),我有: 所以应该发生的是,当他单击应用程序时,截屏线程将停止。但是,我必须残酷地搞砸一些东西,因为当线程运行时,它甚至不会让窗口重新出现。这是我的第一个话题
问题内容: 我有一个侦听端口的简单TCP服务器。 我先将其启动,然后在Mac上使用Ctrl + Z将其关闭。当我尝试再次运行它时,出现以下错误消息: 我是否以错误的方式关闭程序?如何防止这种情况发生? 问题答案: 要结束程序,您应该使用+ 。如果这样做,它会发送,从而允许程序正常结束,并与正在侦听的任何端口解除绑定。 另请参阅:https : //superuser.com/a/262948/48
问题内容: 我有以下代码: 在发生某些事件之后,我应该停止在的方法中声明的操作,该方法实现。 我怎样才能做到这一点?我无法关闭执行器,只能撤消我的定期任务。我可以用吗?如果可以的话,请告诉我它将如何工作。 问题答案: 使用。该是你的任务的处理。您需要取消此任务,它将不再执行。 实际上,是签名,并将其与参数一起使用将导致当前正在运行的执行线程被调用中断。如果线程在阻塞的可中断调用(例如)中等待,则会