Java objectinputstream.readobject()行:不可用[局部变量不可用]
我已经编写了一个客户端,它在主线程之外的单独线程中使用Java objectinputstream.readobject()行:不可用[局部变量不可用],java,multithreading,exception,objectinputstream,Java,Multithreading,Exception,Objectinputstream,我已经编写了一个客户端,它在主线程之外的单独线程中使用ObjectInputStream读取TCP消息。我使用的是Eclipse,虽然控制台中没有抛出异常,但调试窗口会随机打开,并在我假设的线程堆栈跟踪中显示以下错误: Thread[Thread-5](Suspended (exception ThreadDeath)) objectinputstream.readobject() line: not available [local variables unavailable] Rec
ObjectInputStream
读取TCP消息。我使用的是Eclipse,虽然控制台中没有抛出异常,但调试窗口会随机打开,并在我假设的线程堆栈跟踪中显示以下错误:
Thread[Thread-5](Suspended (exception ThreadDeath))
objectinputstream.readobject() line: not available [local variables unavailable]
ReceiveRunnable.run()line:25
Thread.run()line:not available
这是异常指向的代码:
class ReceiveRunnable implements Runnable {
Object receivedObject;
public void run() {
while (true) {
try {
receivedObject = client.objectInStream.readObject(); //line 25
} catch (IOException e) {
// client.reconnectToServer();
// System.out.println("IO exception in run()");
// System.out.println(e);
e.printStackTrace();
} catch (ClassNotFoundException e) {
System.out.println("Class Not Found exception in run()");
System.out.println(e);
e.printStackTrace();
} catch (Exception e) {
System.out.println("Exception in ReceiveRunnable.run()");
System.out.println(e.toString());
e.printStackTrace();
}
}
}
}
client.objectInStream
是在client
类中创建的:
void connectToServer(){
try {
connected = false;
socket = new Socket(host, port);
System.out.println("<Connected> " + socket);
objectInStream = new ObjectInputStream(socket.getInputStream());
objectOutStream = new ObjectOutputStream(socket.getOutputStream());
receiveThread = new Thread(new ReceiveRunnable(this, "receive"));
receiveThread.start();
/* used to periodically ping the server*/
long delay = 0;
long period = 5000;
connTimer.schedule(clientCheckConnTimerTask, delay, period);
connected = true;
sendString("[conn]" + clientUUID);
} catch (IOException e) {
msgBox.set2LineOkMessage("Can not connect to server.", "");
msgBox.show();
}
}
void connectToServer(){
试一试{
连接=错误;
套接字=新套接字(主机、端口);
System.out.println(“+socket”);
objectInStream=新的ObjectInputStream(socket.getInputStream());
objectOutStream=新的ObjectOutputStream(socket.getOutputStream());
receiveThread=新线程(新的ReceiveUnnable(此“接收”);
receiveThread.start();
/*用于定期ping服务器*/
长延时=0;
长周期=5000;
connTimer.schedule(clientCheckConnTimerTask,delay,period);
连接=真;
sendString(“[conn]”+clientUUID);
}捕获(IOE异常){
msgBox.set2LineOkMessage(“无法连接到服务器。”,”);
msgBox.show();
}
}
有谁能告诉我是什么导致了这个问题,以及我可以如何解决这个问题吗?如果
try
后面没有一个catch(EOFEException exc)
关闭套接字并中断循环,那么您的代码是错误的
您应该始终在同一套接字的
ObjectInputStream
之前创建ObjectOutputStream
,而不是之后,否则可能会出现死锁。如果该try
后面没有关闭套接字并中断循环的catch(EOFEException exc)
,则您的代码不正确
您应该始终在同一套接字的
ObjectInputStream
之前创建ObjectOutputStream
,而不是之后,否则可能会出现死锁。我已将捕获的异常添加到示例中(很抱歉缩进,由于某些原因,它无法正确解析)<代码>EOFEException被IOException
捕获。此外,我还交换了创建ObjectOutputStream
和ObjectInputStream
的顺序,虽然我不认为这是问题的原因,但它加快了加载时间,谢谢。我让我的应用程序运行了几个小时,您的解决方案似乎解决了我的问题。我不明白为什么创建对象流的顺序很重要。你能解释一下为什么吗?看Javadoc。ObjectOutputStream
的构造函数写入一个头,该头由ObjectInputStream
的构造函数读取。如果首先在两端创建输入流,则没有任何内容可读取,因此两侧都会死锁。如果任何一方首先创建输出流,则不会发生。如果双方都先创建输出流,那么无论另一方做什么,都无法实现。我已将捕获的异常添加到示例中(很抱歉缩进,由于某些原因,它无法正确解析)<代码>EOFEException被IOException
捕获。此外,我还交换了创建ObjectOutputStream
和ObjectInputStream
的顺序,虽然我不认为这是问题的原因,但它加快了加载时间,谢谢。我让我的应用程序运行了几个小时,您的解决方案似乎解决了我的问题。我不明白为什么创建对象流的顺序很重要。你能解释一下为什么吗?看Javadoc。ObjectOutputStream
的构造函数写入一个头,该头由ObjectInputStream
的构造函数读取。如果首先在两端创建输入流,则没有任何内容可读取,因此两侧都会死锁。如果任何一方首先创建输出流,则不会发生。如果双方都先创建输出流,那么不管另一方做什么,都无法实现。