1

所以我有这样的事情:

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时,它说它找不到acceptor。当将接受器移出 try 块时,它会因未处理的异常而爆炸。

我应该Socket clientSock;在 try 块之前放一个类似的东西吗?

谢谢。

4

3 回答 3

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());
}

以这种方式做事的好处——当你可以侥幸逃脱时——是“幸福的道路”读起来更清楚;更容易遵循代码应该做的事情。这种方法的阴暗面是它会导致将各种错误情况混为一谈,因此您无法针对个别问题做出具体反应。但有时,即使这也是一个优势,而不是一个问题。

于 2012-05-03T21:08:40.753 回答
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();  


}
于 2012-05-03T21:03:48.880 回答
1

不,您应该在 try 块之前声明接受者,如下所示:

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();
}

对于此代码,接受器可以在 while 循环内为空,要么在那里检查它,要么在 catch 块内做一些流动改变。

您可能还想处理可能抛出的IOException异常Socket clientSock = acceptor.accept(); ,因为这样的异常会破坏 while 循环——这可能不符合计划。

一般的解释是java范围变量声明“尽可能限制”接受器是在代码的try块内声明的,因此在它之外不可用/未声明。

于 2012-05-03T21:03:29.827 回答