Java:使用try块中的变量

时间:2012-05-03 21:01:50

标签: java try-catch variable-assignment

所以我有这样的事情:

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;这样的东西吗?

感谢。

3 个答案:

答案 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中声明,因此在它之外不可用/未声明。