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
的构造函数读取。如果首先在两端创建输入流,则没有任何内容可读取,因此两侧都会死锁。如果任何一方首先创建输出流,则不会发生。如果双方都先创建输出流,那么不管另一方做什么,都无法实现。