【问题标题】:objectinputstream.readobject() line: not available [local variables unavailable]objectinputstream.readobject() 行:不可用 [局部变量不可用]
【发布时间】:2013-04-30 01:31:09
【问题描述】:

我编写了一个客户端,它使用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();
    }
}

谁能告诉我是什么导致了这个问题以及如何解决?

【问题讨论】:

    标签: java multithreading exception objectinputstream


    【解决方案1】:

    如果try 后面没有跟随关闭套接字并跳出循环的catch (EOFException exc),则您的代码不正确。

    对于同一个套接字,您应该始终在ObjectInputStream 之前创建ObjectOutputStream,而不是之后,否则会出现死锁。

    【讨论】:

    • 我已经将我捕捉到的异常添加到我的示例中(抱歉缩进,由于某种原因它没有正确解析)。 EOFExceptionIOException 捕获。我还交换了创建ObjectOutputStreamObjectInputStream 的顺序,尽管我认为这不是问题的原因,它加快了加载时间,谢谢。
    • 我的应用程序运行了几个小时,您的解决方案似乎解决了我的问题。我不明白为什么创建对象流的顺序很重要。你能解释一下为什么会这样吗?
    • 参见 Javadoc。 ObjectOutputStream 的构造函数写入一个由ObjectInputStream 的构造函数读取的标头。如果您首先在两端创建输入流,则没有可读取的内容,因此双方都死锁。如果任何一方首先创建输出流,则不会发生。如果双方先创建输出流,则无论对方做什么都不会发生。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-04-29
    • 2015-10-16
    • 2018-11-02
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多