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

私はこのコードでソケット上の新しいデータを聞いており、次のようになります。

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

「 run()」の後に「throwsIOException 」を追加すると、次のようになります。

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 {
                    ^

簡単なことかもしれませんが、途方に暮れています。どうすればこれに合格できますか?

4

6 に答える 6

5

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

try {
  int i = in.read();
} catch (IOException e) {
  // do something that makes sense for your application
}
于 2011-07-01T13:47:34.437 に答える
1

できません-のrun()メソッドは、Threadチェックされていない例外をスローすることはできません。これは実際には匿名クラスとは何の関係もありませんThread。直接拡張しようとしても同じことが起こります。

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

于 2011-07-01T13:48:51.583 に答える
1

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

于 2011-07-01T13:51:35.617 に答える
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();
    }

の結果を処理する場合は、将来get()を呼び出すことができますCallable。スローした例外はすべてスローされますCallable

于 2011-07-01T14:00:38.207 に答える
0

try / catchを使ってみましたか?一定のストリームが入ってこないという理由だけで、その例外が発生する可能性があります。

于 2011-07-01T13:49:23.407 に答える
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();
于 2011-07-01T13:50:38.960 に答える