运行方法中的java.io.OptionalDataException?

运行方法中的java.io.OptionalDataException?,java,networking,client,Java,Networking,Client,为什么我在run方法中收到java.io.OptionalDataException ObjectInputStream多次读取项目和用户,然后它会崩溃,出现OptionalDataException。我认为它与EOFEException有关 它在创建新套接字时打印一条消息 它打印objectInputStream的值 它还打印消息 堆栈跟踪+消息 已创建新套接字 已创建新套接字 已创建新套接字 下面是ObjectInputStream:java.io。ObjectInputStream@143

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

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

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

堆栈跟踪+消息
已创建新套接字
已创建新套接字
已创建新套接字
下面是ObjectInputStream:java.io。ObjectInputStream@1430b5c
下面是消息:REA:ITEM:

下面是ObjectInputStream:java.io。ObjectInputStream@1decdecjavadoc对异常的解释如下:

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

  • 当流中的下一个元素是基元数据时,尝试读取对象。在这种情况下,OptionalDataException的长度字段设置为可立即从流中读取的基本数据字节数,而eof字段设置为false
  • 试图通过类定义的readObject或readExternal方法读取超过数据末尾的数据。在这种情况下,OptionalDataException的eof字段设置为true,长度字段设置为0
简而言之,写入套接字的内容与代码试图读取的内容不匹配。要弄清这一点,您需要:

  • 找出异常中的
    eof
    length
    的值,以及
  • 限制故障发生的环境

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

请发布完整的异常堆栈跟踪,以便我们可以查看有关异常原因的更多详细信息。数据是如何写入流的?您是否阅读了异常信息?因此,如果您能够捕获异常并打印它的eof和length值,也将有助于跟踪问题。在模型中的一个方法中使用writeUTF()而不是writeObject()导致的问题。我使用的是write(bytes)和reading as readObject。所以改为writeObject和readObject,异常得到解决:-)thnx
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();
    }
}