3

我有这个代码:

public void post(String message) {
    output.close();
    final String mess = message;
    (new Thread() {
        public void run() {
            while (true) {
                try {
                    output.println(mess);
                    System.out.println("The following message was successfully sent:");
                    System.out.println(mess);
                    break;
                } catch (NullPointerException e) {
                    try {Thread.sleep(1000);} catch (InterruptedException ie) {}
                }
            }
        }
    }).start();
}

如您所见,我在代码的最开头关闭了套接字,然后try使用它将一些信息发送到另一台计算机。程序写给我“以下消息已成功发送”。这意味着 NullPointerException 没有被抛出。

那么,如果 Java 尝试使用套接字的封闭输出流,它是否不会抛出异常?有没有办法检查套接字是关闭还是打开?

添加

我通过以下方式初始化套接字:

clientSideSocket = new Socket(hostname,port);
PrintWriter out = new PrintWriter(clientSideSocket.getOutputStream(), true);
browser.output = out;
4

2 回答 2

7

我应该看起来更好。来自 PrintWriter 的 javadoc:

此类中的方法从不抛出 I/O 异常,尽管它的某些构造函数可能会。客户端可以通过调用 {@link #checkError checkError()} 来查询是否发生了任何错误。

于 2010-04-09T13:17:41.697 回答
3

(a) 不要在网络上使用 PrintStream 或 PrintWriter,因为它们会抑制异常。它们实际上仅用于日志文件或控制台,您不太关心。通过网络,您正在参与协议,您需要立即了解故障。

(b) 如果您关闭了它的输入或输出,Socket.isClosed() 将返回 true。注意它不会告诉你其他人是否关闭了连接——这不是它的功能。只有阅读 EOS 才能告诉你这一点。

于 2010-04-09T23:19:31.043 回答