所以我有这样的事情:
try{ServerSocket acceptor = new ServerSocket(4782);}
catch(IOException e){System.err.println("ERROR: Couldn't listen on port 4782!");}
while (true)
{
Socket clientSock = acceptor.accept();
}
但是在尝试分配clientSock时,它说它无法找到接受者。将接受器移出try块时,它会以未处理的异常爆炸。
我应该在try块之前放置Socket clientSock;
这样的东西吗?
感谢。
答案 0 :(得分:4)
这是其他人建议的替代方法:您可以将更多代码移到try块中:
try{
ServerSocket acceptor = new ServerSocket(4782);
while (true) {
Socket clientSock = acceptor.accept();
}
} catch(IOException e){
System.err.println("ERROR: Network problem:" + e.getMessage());
}
以这种方式做事的好处 - 当你可以侥幸逃脱时 - 就是“快乐的道路”更清晰;遵循代码应该做的更容易。这种方法的黑暗面是它导致将各种错误条件混为一谈,因此您无法专门针对个别问题做出反应。但有时候,即使这是一个优势而不是问题。
答案 1 :(得分:2)
您可以将实例化保留在try-catch中,但可以移出变量声明。
ServerSocket acceptor = null;
try{acceptor = new ServerSocket(4782);}
catch(IOException e){System.err.println("ERROR: Couldn't listen on port 4782!");}
while (true)
{
Socket clientSock = acceptor.accept();
}
答案 2 :(得分:1)
不,你应该在try块之前放置acceptor的声明,如下所示:
ServerSocket acceptor = null;
try {
acceptor = new ServerSocket(4782);
} catch (IOException e) {
System.err.println("ERROR: Couldn't listen on port 4782!");
}
while (true) {
Socket clientSock = acceptor.accept();
}
对于这段代码,acceptor在while循环中可以为null,要么在那里检查它,要么在catch块中做一些流动交替。
你可能还想处理IOException
可能抛出的Socket clientSock = acceptor.accept();
,因为这样的异常会破坏while循环 - 这可能不符合计划。
一般的解释是java范围变量声明“尽可能限制”的接受器在代码中的try-block中声明,因此在它之外不可用/未声明。