繁体   English   中英

当我将SocketException扔回IOException时,为什么Java会抱怨?

[英]Why does java complain when I rethrow SocketException to be caught by IOException?

一般的例外规则是,在捕获一般异常之前,您要捕获更具体的异常。 我有一种情况,关闭服务器时会抛出SocketException: socket closed是由IOException捕获的来自我的侦听器的,但是我不想在用户关闭服务器时向用户显示该消息。 其他所有内容都可能是实际错误,因此应该向他们显示,因此我捕获了SocketException ,检查其消息,如果未socket closed ,则应重新IOExceptionIOException ,以作为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扩展了IOException ,因此应该由更通用的IOException捕获。 为什么会出现此错误? (顺便说一下,在NetBeans中运行项目的效果很好,顺便说一句,当服务器关闭时,它不会向用户显示异常。)

您的throwtry之外 ,因此,下面的catch不会处理引发的异常。

第二个catch不会捕获该重新抛出,因为第二个catch并没有将其抛出在try块中。 您需要重组代码。


例如,最直接的重组是这样的:

public void run() {
    while (runner == Thread.currentThread()) {
        System.out.println("waiting for connection...");
        try {
            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;
        }
    }
}

嵌套的尝试使我哭了一下,但是可以完成工作(老实说,我的头顶上,我想不出一个更好的方法,不会走得太远)。

Catch语句从其各自的try块捕获异常,而不从列表中的其他catch块捕获异常。 您从尝试之外抛出了异常,因此后续捕获块不会捕获该异常。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM