例外の一般的なルールは、一般的なものをキャッチする前に、より具体的なものをキャッチすることです。SocketException: socket closed
サーバーを閉じると、によってキャッチされるリスナーからスローがスローされる場合がありますがIOException
、サーバーを閉じるときにそのメッセージをユーザーに表示したくありません。他のすべてはおそらく実際のエラーなので、それらに表示する必要があるため、 をキャッチしSocketException
、そのメッセージを確認し、そうでない場合は、キャッチsocket closed
して として処理するために再スローする必要がありIOException
ます。Java/NetBeans 7.0.1 はそれを好まないようです。これが私のコードです:
public void run() {
while (runner == Thread.currentThread()) {
System.out.println("waiting for connection...");
try {
Socket s = server.accept(); //throws SocketException/IOException
if (session == null) {
session = new ReceiveSession(s, parent);
} else {
s.close();
}
} catch (SocketException e) {
if (!e.getMessage().equals("socket closed")) {
throw e; //error line, "unreported exception SocketException"
}
} catch (IOException e) {
e.printStackTrace();
parent.showError("Someone tried to connect but the connection failed: " + e);
session = null;
}
}
}
クリーンアップしてビルドしようとすると、次のようになります。
error: unreported exception SocketException; must be caught or declared to be thrown
throw e;
1 error
SocketException
extendsであるためIOException
、より一般的なIOException
. なぜこのエラーが発生するのですか? (プロジェクトをそのまま NetBeans で実行すると完全に機能しますが、サーバーが必要に応じてシャットダウンしたときに例外がユーザーに表示されることはありません。)