为什么 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();
}
}
}
我有运行客户端-服务器交互的代码。忽略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();
}
}
}