当我重新抛出SocketException被IOException捕获时,为什么java会抱怨?

lda*_*dam 1 java exception-handling netbeans-7

异常的一般规则是在捕获常规异常之前捕获更具体的异常规则.我有一个案例,关闭服务器抛出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;
            }
        }

    }
Run Code Online (Sandbox Code Playgroud)

在尝试清理和构建时,我得到:

error: unreported exception SocketException; must be caught or declared to be thrown
                throw e;
1 error
Run Code Online (Sandbox Code Playgroud)

由于SocketException延伸IOException,它应该被更一般的捕获IOException.为什么我会收到此错误?(在NetBeans中按原样运行项目完全顺便运行,当服务器按我的意愿关闭时,它不会向用户显示异常.)

Joa*_*uer 6

throw外面try块,所以抛出的异常将不会被处理catch的下面.