Java:使用try块中的变量

Java:使用try块中的变量,java,try-catch,variable-assignment,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(); } ServerSocket acceptor = null; try {

所以我有这样一件事:

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


}
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();
}
但当试图分配clientSock时,它说找不到acceptor。当将接受程序移出try块时,它会爆炸并产生一个未处理的异常

我应该放一个类似于
socketclientsock在try块之前


谢谢。

不,您应该在try块之前放置acceptor的declarion,如下所示:

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


}
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循环中,acceptor可以为null,或者在那里检查它,或者在catch块中做一些改变

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


一般的解释是,java作用域变量声明“尽可能限制”接受程序是在代码的try块内声明的,因此在try块外不可用/未声明。

否您应该将接受程序的declarion放在try块之前,如下所示:

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


}
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循环中,acceptor可以为null,或者在那里检查它,或者在catch块中做一些改变

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


一般的解释是,java作用域变量声明“尽可能限制”接受程序是在代码的try块内声明的,因此在try块外不可用/未声明。

您可以将实例化保留在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();  


}

您可以将实例化保留在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();  


}

这里的其他人建议的替代方案是:您可以将更多代码移到try块中:

try{
    ServerSocket acceptor = new ServerSocket(4782);

    while (true) {
        Socket clientSock = acceptor.accept();  
    }
} catch(IOException e){
    System.err.println("ERROR: Network problem:" + e.getMessage());
}

这样做的好处是——当你可以逍遥法外时——“快乐之路”读起来更清晰;更容易理解代码应该做什么。这种方法的阴暗面是,它会导致将各种错误条件集中在一起,因此您无法对个别问题做出具体的反应。但有时,即使这样,也只是一个优势而不是问题。

这里的其他人建议的替代方案是:您可以将更多代码移到try块中:

try{
    ServerSocket acceptor = new ServerSocket(4782);

    while (true) {
        Socket clientSock = acceptor.accept();  
    }
} catch(IOException e){
    System.err.println("ERROR: Network problem:" + e.getMessage());
}


这样做的好处是——当你可以逍遥法外时——“快乐之路”读起来更清晰;更容易理解代码应该做什么。这种方法的阴暗面是,它会导致将各种错误条件集中在一起,因此您无法对个别问题做出具体的反应。但有时,即使这样,也只是一种优势而不是问题。

不要使用
null
s这样的选项!!如果抛出
IOException
,会发生什么情况?@TomHawtin-tackline我尊重问题中的原始示例。像这样使用null确实很糟糕。捕获IOException并在被告知连接不好后继续侦听也是不好的。@TomHawtin tackline为什么这样使用空值不好?是否存在导致意外行为的漏洞?@SuperDisk在这个特定示例中,程序只是在catch块中打印一个错误,然后继续,因此当您调用acceptor.accept()时,代码将抛出NullPointerException,但这是一个快速修复。在实际初始化之前分配null还有其他缺点吗?不要像那样使用
null
s!!如果抛出
IOException
,会发生什么情况?@TomHawtin-tackline我尊重问题中的原始示例。像这样使用null确实很糟糕。捕获IOException并在被告知连接不好后继续侦听也是不好的。@TomHawtin tackline为什么这样使用空值不好?是否存在导致意外行为的漏洞?@SuperDisk在这个特定示例中,程序只是在catch块中打印一个错误,然后继续,因此当您调用acceptor.accept()时,代码将抛出NullPointerException,但这是一个快速修复。在实际初始化null之前分配null还有其他缺点吗?@grampage这是一种相当间接的处理方法。最好完全避免
null
。@TomHawtin-tackline-indirect总比完全不好。如果我有动力自己写一个答案,我会以不同的方式来做,但没有理由是间接的。我经常看到这些东西写得不正确。通常情况下,即使它被纠正了,它仍然是错误的。它可以很容易地编写而不产生任何混乱。@TomHawtin tackline我认为检查
null
并没有错——它只是不符合您的编码标准。这很好。我不会在这里检查null,我也不会启动acceptor为null。我会(可能会声明acceptor final)在catch块中做一些改变流的事情。这个问题并不是专门针对这个问题,但这个问题是紧密耦合的。如果我有好的建议,我不介意再更新我的答案。(我的观点是,检查acceptor是否为null是“错误的”,这种情况应该在catch块中处理,或者可能在捕获NPE的代码的某些情况下处理。)@grampage这是一种相当间接的处理方法。最好完全避免
null
。@TomHawtin-tackline-indirect总比完全不好。如果我有动力自己写一个答案,我会以不同的方式来做,但没有理由是间接的。我经常看到这些东西写得不正确。通常情况下,即使它被纠正了,它仍然是错误的。它可以很容易地写出来,没有任何混乱。@TomHawtin-tackline我认为检查