2012-05-03 7 views
1

を使用する:のJava:だから私はこのようなもの持っているの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(); 


} 

をしかしclientSockを割り当てるしようとすると、それが受容体を見つけることができないと言います。アクセプタをtryブロックから移動すると、アクセッサを処理できない例外で爆発します。

tryブロックの前にSocket clientSock;のようなものを置くべきですか?

ありがとうございました。

+0

(私はJava言語がこのようなバグをキャッチするのが素晴らしいと思いますが、通常は間違っていても修正されていますが、アレックスは私に同意していません) –

答えて

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

このようなことをやっての利点 - あなたが離れで得ることができたときにそれは "幸せな道"がもっとはっきりと読み取れることです。コードが行うべきことに従う方が簡単です。このアプローチの暗い面は、さまざまなエラー条件をまとめて処理するため、個々の問題に具体的に反応することができないということです。しかし、時には、それは問題ではなく利点です。

+0

'accept'の周りにその特定の' catch'を置かないようにするには 'catch'から例外を投げることができます(' IOException'は適切でしょう)。リターンまたはネストされたtry-catch(2つの小さなメソッドに分割したいかもしれません。 –

1

んが、あなたはこのように、tryブロックの前にアクセプターのdeclarionを置くべきではありません。このコードの場合

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ループ内のnullも何かの流れがそれをチェックしたり、行うことができますキャッチブロック内での調整。

Socket clientSock = acceptor.accept(); がスローする可能性があるIOExceptionを処理したい場合もあります。そのような例外は、計画通りではないかもしれないwhileループを破るためです。

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

+3

'acceptor'がnullになる受け入れループ... – climbage

+0

@climbageそれはそれを扱うむしろ間接的な方法です。 「ヌル」を一切避けてベスト –

+0

@ TomHawtin-tackline間接は、まったくないよりも優れています。私は自分自身で答えを書こうと思っていましたが、私はそれをやり直すでしょう。 – climbage

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


} 
+0

そのような 'null'sを使用しないでください! 'IOException'がスローされるとどうなりますか? –

+0

@ TomHawtin-tackline質問の元の例を尊敬していました。このようにnullを使用することは実際には非常に悪いことです。また、IOExceptionを捕まえて、接続が悪いと聞かれた後にリッスンすることも悪いことです。 – Martin

+0

@ TomHawtin-tacklineなぜnullのようなものを使用するのが悪いですか?予期しない動作をする抜け穴がありますか? –