为什么最终阻止异常在客户端 - 服务器程序中不起作用?

R30*_*30B 0 java exception finally

我已经运行了客户端-服务器交互的代码。忽略线程部分,我知道那行不通。

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();
            }
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

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

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

Jon*_*oni 5

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

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

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

        } finally {
            if (socket != null) {
                try {
                    socket.close();
                } catch (IOException ioe) {
                    e.printStackTrace();
                }
            }
        }
Run Code Online (Sandbox Code Playgroud)