0

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

ObjectInputStream 多次读取项目和用户,然后它与OptionalDataException. 我认为这有关EOFException

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

堆栈跟踪 + 消息

已创建新套接字 已
创建新套接字 已创建
新套接字
这里是 ObjectInputStream :java.io.ObjectInputStream@1430b5c
这里是消息 :REA:ITEM:
这里是 ObjectInputStream :java.io.ObjectInputStream@1decdec <
这里是消息 :ADD:ITEM:
新套接字created
New socket created
Here is ObjectInputStream :java.io.ObjectInputStream@b2fd8f
Here is message :REA:ITEM:
New socket created
java.io.OptionalDataException
                   at java.io.ObjectInputStream.readObject0(Unknown Source)
                   at java.io.ObjectInputStream。
                   在 fedaih.SocketTask.run(SocketTask.java:55) 处读取对象(未知来源)
                   在 java.lang.Thread.run(Unknown Source)
创建了新套接字
这里是 ObjectInputStream :java.io.ObjectInputStream@1c39a2d
这里是消息 :REA:USER:
这里是 ObjectInputStream :java.io.ObjectInputStream@13bad12
这里是消息 :ADD :USER:
New socket created
New socket created
Here is ObjectInputStream :java.io.ObjectInputStream@eb7859
这是消息 :REA:USER:
java.io.OptionalDataException
                   at java.io.ObjectInputStream.readObject0(Unknown Source)
                   at java.io。 ObjectInputStream.readObject(Unknown Source)
                   at 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();
    }
}
4

1 回答 1

2

javadoc 对异常的解释如下:

异常指示由于未读取的原始数据或流中属于序列化对象的数据结束而导致对象读取操作失败。在两种情况下可能会抛出此异常:

  • 当流中的下一个元素是原始数据时,尝试读取对象。在这种情况下,OptionalDataException 的长度字段设置为可立即从流中读取的原始数据的字节数,并且 eof 字段设置为 false。
  • 试图通过类定义的 readObject 或 readExternal 方法读取数据的末尾。在这种情况下,OptionalDataException 的 eof 字段设置为 true,长度字段设置为 0。

简而言之,写入套接字的内容与您的代码试图读取的内容之间存在不匹配。要深入了解这一点,您需要:

  • 找出异常和异常中的值是什么eoflength以及
  • 限制发生故障的环境。

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

于 2012-05-07T03:55:01.710 回答