run 方法中的 java.io.OptionalDataException?

标签 java networking client

为什么我在 run 方法中收到 java.io.OptionalDataException

ObjectInputStream 多次读取项目和用户,然后因 OptionalDataException 崩溃。我认为它与EOFException有关。

创建新套接字时会打印一条消息 它打印objectInputStream的值 它还打印消息

堆栈跟踪 + 消息

已创建新套接字
创建新套接字
创建新套接字
这是ObjectInputStream:java.io.ObjectInputStream@1430b5c
这是消息:REA:ITEM:
这是 ObjectInputStream :java.io.ObjectInputStream@1decdec <
这是消息:ADD:ITEM:
创建新套接字
创建新套接字
这是 ObjectInputStream :java.io.ObjectInputStream@b2fd8f
这是消息:REA:ITEM:
创建新套接字
java.io.OptionalDataException
在 java.io.ObjectInputStream.readObject0(来源未知)
在 java.io.ObjectInputStream.readObject(来源未知)
在 fedaih.SocketTask.run(SocketTask.java:55)
在 java.lang.Thread.run(来源未知)
创建新套接字
这是 ObjectInputStream :java.io.ObjectInputStream@1c39a2d
这是消息:REA:USER:
这是 ObjectInputStream :java.io.ObjectInputStream@13bad12
这是消息:ADD:USER:
创建新套接字
创建新套接字
这是 ObjectInputStream :java.io.ObjectInputStream@eb7859
这是消息:REA:USER:
java.io.OptionalDataException
在 java.io.ObjectInputStream.readObject0(来源未知)
在 java.io.ObjectInputStream.readObject(来源未知)
在 fedaih.SocketTask.run(SocketTask.java:55)
在 java.lang.Thread.run(来源未知)

public void run() {
        
    try {
        ObjectOutputStream objectOutputStream = new ObjectOutputStream(outputStream);
        ObjectInputStream objectInputStream = new ObjectInputStream(inputStream);
        User user = null;
        Item item = null;
        String upc = null;
        String username = null;
        
        // This is the line where the error occurs
        String message = (String) objectInputStream.readObject();
        switch (message) {
        
            case "REA:ITEM:":   upc = (String) objectInputStream.readObject();
                                item = inventoryFileManager.readItem(upc);
                                objectOutputStream.writeObject(item);
                                objectOutputStream.flush();
                                break;
                                
            case "REA:USER:":   username = (String) objectInputStream.readObject();
                                user = userFileManager.readUser(username);
                                objectOutputStream.writeObject(user);
                                objectOutputStream.flush();
                                break;
            
            case "REM:ITEM:":   upc = (String) objectInputStream.readObject();
                                inventoryFileManager.removeItem(upc);
                                break;
                                
            case "REM:USER:":   username = (String) objectInputStream.readObject();
                                userFileManager.removeUser(username);
                                break;
            
            case "ADD:ITEM:":   item = (Item) objectInputStream.readObject();
                                if (item != null) {
                                        inventoryFileManager.addItem(item);
                                }
                                break;
                                
            case "ADD:USER:":   user = (User) objectInputStream.readObject();
                                if (user != null) {
                                        userFileManager.addUser(user);
                                }
                                break;
                        
            case "UPD:ITEM:":   item = (Item) objectInputStream.readObject();
                                inventoryFileManager.updateItem(item);
                                break;
                
            case "UPD:USER:":   user = (User) objectInputStream.readObject();
                                userFileManager.updateUser(user);
                                break;
                                
            case "ALL:ITEM:":   objectOutputStream.writeObject(inventoryFileManager.readAllItems());
                                objectOutputStream.flush();
                                break;
                
            case "ALL:USER:":   objectOutputStream.writeObject(userFileManager.readAllUsers());
                                objectOutputStream.flush();
        }
        objectOutputStream.close();
        objectInputStream.close();
        
    } catch (IOException e) {
        e.printStackTrace();
    } catch (ClassNotFoundException e) {
        e.printStackTrace();
    } catch (PointOfSaleException e) {
        e.printStackTrace();
    }
}

最佳答案

javadoc对该异常的解释如下:

Exception indicating the failure of an object read operation due to unread primitive data, or the end of data belonging to a serialized object in the stream. This exception may be thrown in two cases:

  • An attempt was made to read an object when the next element in the stream is primitive data. In this case, the OptionalDataException's length field is set to the number of bytes of primitive data immediately readable from the stream, and the eof field is set to false.
  • An attempt was made to read past the end of data consumable by a class-defined readObject or readExternal method. In this case, the OptionalDataException's eof field is set to true, and the length field is set to 0.

简而言之,写入套接字的内容与代码尝试读取的内容不匹配。要弄清楚这一点,您需要:

  • 找出异常中 eoflength 的值,并且
  • 确定发生故障的情况。

然后,将您的代码与编写对象的代码进行比较,并(使用上面的证据)找出不匹配的地方。

关于run 方法中的 java.io.OptionalDataException?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10476056/

相关文章:

java - 使用选择选项标签从Java中的数据库中检索记录

java - 通用返回

amazon-web-services - 什么是弹性网络接口(interface) (ENI),您什么时候使用它?

c++ - Boost asio async_read_some 返回少量数据

Java套接字客户端连接和断开问题

java - 降低 Maven 构建线程/进程的优先级

java - Java 中的 HTTPS 以奇怪的结果结束

linux - 将linux内核实现为路由器

javascript - 客户端上是Gun.js "safe"吗?

algorithm - 是否有任何好的算法来检测停止向服务器发送心跳的客户端?