2011-07-01 8 views
2
InputStream in = ClientSocket.getInputStream(); 
new Thread() 
{ 
    public void run() { 
     while (true) 
     { 
      int i = in.read(); 
      handleInput(i); 
     } 
    } 
}.start(); 

私はこのコードでソケットに新しいデータを聞いているとget:匿名スレッドで例外を宣言するにはどうすればよいですか?

FaceNetChat.java:37: unreported exception java.io.IOException; must be caught or declared to be thrown 
       int i = in.read(); 
          ^

私が追加 "はIOExceptionがスロー" の後に "実行()を" 私が手:

FaceNetChat.java:34: run() in cannot implement run() in java.lang.Runnable; overridden method does not throw java.io.IOException 
     public void run() throws IOException { 
        ^

これはおそらく単純なものですが、私は迷っています。どのように私はこれを渡すことができますか?

+0

プログラムで例外を処理する方法を教えてください。 – skaffman

+0

@SomeBloke、Runnableを実装し、スレッドをサブクラス化するのではなく、スレッドに渡すのがベストプラクティスと考えられます。 –

答えて

5

例外を送出しないRunnable.run()のインターフェイスを上書きすることはできません。代わりに、runメソッドで例外を処理する必要があります。

try { 
    int i = in.read(); 
} catch (IOException e) { 
    // do something that makes sense for your application 
} 
1

あなたがすることはできません - Threadrun()方法は、単純に未チェックの例外をスローすることはできません。これは本当に匿名クラスとは関係ありません。Threadを直接拡張しようとすると同じことになります。

例外が発生したときに実行したいことを解決する必要があります。あなたはそれをスレッドを殺すしたいですか?どういうわけか報告されますか?チェックされていない例外、トップレベルのハンドラなどの使用を検討してください。

0

try/catchを使ってみましたか?一定のストリームが入っていないため、例外が発生している可能性があります。

0

未処理の例外として例外を処理または再処理する必要があります。

InputStream in = ClientSocket.getInputStream(); 
new Thread() { 
    public void run() { 
    try { 
     while (true) { 
     int i = in.read(); 
     handleInput(i); 
     } 
    } catch (IOException iox) { 
     // handle, log or wrap in runtime exception 
    } 
    } 
}.start(); 
1

このコードは別のスレッドで実行されているため、例外を「渡す」ことはできません。それはどこで捕らえられるだろうか?例外は非同期イベントではなく、フロー制御構造です。 runメソッドで試してみてください。

1

使用java.util.concurrent.Callable<V>代わり:

final Callable<Integer> callable = new Callable<Integer>() { 

     @Override 
     public Integer call() throws Exception { 
      ... code that can throw a checked exception ... 
     } 
    }; 
    final ExecutorService executor = Executors.newSingleThreadExecutor(); 
    final Future<Integer> future = executor.submit(callable); 
    try { 
     future.get(); 
    } finally { 
     executor.shutdown(); 
    } 

あなたがCallableの結果に対処したいときは、将来にget()は呼び出すことができます。 Callableが投げた例外をスローします。

関連する問題