为什么 finally block in exception 在客户端-服务器程序中不起作用?

Why finally block in exception is not working in client-server program?

我有运行客户端-服务器交互的代码。忽略threading的部分,我知道不行。

import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.io.PrintWriter;
import java.net.*;

public class Client {

    public static void main(final String[] args) throws Exception {
        Socket socket = null;
        while (true) {
            try {
                socket = new Socket("localhost", 3456);
                System.out.println("Connect Ho gaya");
                final BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
                final PrintWriter pw = new PrintWriter(socket.getOutputStream(), true);
                final BufferedReader sr_receive = new BufferedReader(new InputStreamReader(socket.getInputStream()));
                Thread sendMes = new Thread(new Runnable() {
                    public void run() {
                        while (true) {
                            try {
                                String send = br.readLine();
                                pw.println(send);
                            } catch (Exception e) {
                                System.out.println("Send Message Problem");
                            }

                        }
                    }
                });

                Thread recMes = new Thread(new Runnable() {
                    public void run() {
                        while (true) {
                            try {
                                String recieve;
                                if ((recieve = sr_receive.readLine()) != null);
                                System.out.println("Server:" + recieve);
                            } catch (Exception e) {
                                System.out.println(e);
                            }

                        }
                    }
                });
                while (true) {
                    recMes.run();
                    sendMes.run();
                }
            } catch (Exception e) {
                e.printStackTrace();
            } finally {
                socket.close();
            }
        }
    }
}

当我 运行 这个客户端程序(没有服务器程序 运行ning)时,我希望它一直显示异常,直到我 运行 服务器端程序出现为止无限循环。

但是在 运行 启动它时,最初它显示退出程序的异常。而且当我删除 finally 部分时,它一直显示异常和无限循环。

您的 finally 块抛出异常。发生这种情况时,执行会退出 try-catch-finally-block 及其所在的循环。

异常可能是由于socket为空引起的。如果在 Socket(host,port) 构造函数中打开连接失败,就会发生这种情况,并且抛出异常而没有向 socket 分配任何内容。在 finally 块中添加一个 if 语句来检查这一点会有所帮助。

也有可能 socket.close 抛出 IOException。您需要为此添加另一个 try-catch。

        } finally {
            if (socket != null) {
                try {
                    socket.close();
                } catch (IOException ioe) {
                    e.printStackTrace();
                }
            }
        }