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を割り当てようとすると、アクセプターが見つからないと表示されます。アクセプターを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ブロック内でフローを変更する何かを実行します。

このような例外はwhileループを壊すため、スローされる可能性のあるものを処理するIOExceptionこともSocket clientSock = acceptor.accept(); できます。これは計画に従っていない可能性があります。

一般的な説明として、Javaスコープの変数宣言は「可能な限り制限する」アクセプターがコードのtry-block内で宣言されているため、コード外では使用できない/宣言されていません。

于 2012-05-03T21:03:29.827 に答える