我目前正在开发一个客户端/服务器软件的项目。我有一个奇怪的问题,希望能解决它,但我完全无法解释原因,我搜索了很长时间。
我希望服务器端有一个while(true)循环强制服务器继续接受客户端,之后关闭套接字。
所以我试着像这样构建它:
public void run() {
Socket socket;
while(true) {
try {
socket = server.accept();
BufferedInputStream in = new BufferedInputStream(socket.getInputStream());
BufferedOutputStream out = new BufferedOutputStream(socket.getOutputStream());
while (socket.isConnected()) {
// TODO income handling
}
in.close();
out.close();
socket.close();
} catch (Exception e) {
break;
}
}
}
但是我得到了Intellij的错误消息,告诉我在这个循环中添加一个结束条件。但我在catch语句中有一个。改变
while(true)
到
while(!false)
导致错误消息消失。任何人都可以解释我的区别以及为什么第一次尝试不起作用?我发现它在研究期间多次这样做。
答案 0 :(得分:2)
首先,IntellJ IDEA检查的目的是帮助您快速发现有问题的代码,而不是让您的生活更加艰难。 你绝对不应该只是为了让你的IDE开心而改变你的代码。
此检查("'虽然'语句无法在不抛出异常的情况下完成")默认情况下会产生警告。 因此,如果您确实遇到错误,那么您可能会意外更改此检查的设置。 可在“编辑器”的“设置”对话框中找到可用检查列表及其严重性设置。检查标签。
关于while (true)
和while (!false)
之间的区别:
它们都会产生相等的字节代码,因此没有差异,只是缺乏这种意图实现。
如果您不想看到特定意图的警告,您可以:
while
)Alt-Enter
和
答案 1 :(得分:0)
这可能是因为你格式化while循环条件的方式。 如果表达式复杂或复杂。编译器没有意识到语句是相同的,如T.J.克劳德在上面说。另一种解释是你创建的while(!false)实际上不是while(!false)。显示您更改while循环的内容以获得其他人的更明确帮助。
答案 2 :(得分:0)
您通过执行此操作来修补您的应用。
IDE(IntelliJ)检测到您正在做一些您不应该做的事情,并且您试图避免IntelliJ尝试通过添加更糟糕的内容来防止您的不良行为。
将条件更改为可以在某个时刻完成或使用标记评估的内容。
顺便说一下,在无限循环中声明无限类和实例是一种可怕的坏习惯。