首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >运行方法中的java.io.OptionalDataException?

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

Stack Overflow用户
提问于 2012-05-07 02:37:36
回答 1查看 5.7K关注 0票数 0

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

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

当新套接字创建时,它打印一条消息,打印objectInputStream的值,它也打印消息。

堆栈跟踪+消息

创建新套接字

创建新套接字

创建新套接字

这是ObjectInputStream :java.io.ObjectInputStream@1430b5c

以下是消息:REA:ITEM:

这是ObjectInputStream :java.io.ObjectInputStream@1decdec <

以下是消息:添加:ITEM:

创建新套接字

创建新套接字

这是ObjectInputStream :java.io.ObjectInputStream@b2fd8f

以下是消息:REA:ITEM:

创建新套接字

java.io.OptionalDataException

自愿

自愿

自愿

创建新套接字

这是ObjectInputStream :java.io.ObjectInputStream@1c39a2d

以下是消息:REA:USER:

这是ObjectInputStream :java.io.ObjectInputStream@13bad12

下面是消息:ADD:USER:

创建新套接字

创建新套接字

这是ObjectInputStream :java.io.ObjectInputStream@eb7859

以下是消息:REA:USER:

java.io.OptionalDataException

自愿

自愿

自愿

代码语言:javascript
运行
复制
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();
    }
}
EN

回答 1

Stack Overflow用户

发布于 2012-05-07 03:55:01

javadoc对异常的解释如下:

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

  • 当流中的下一个元素是原始数据时,尝试读取对象。在这种情况下,OptionalDataException的length字段被设置为从流中立即可读的原始数据的字节数,eof字段设置为false,
  • 尝试读取类定义的readObject或readExternal方法可使用的数据结束后的数据。在本例中,OptionalDataException的eof字段设置为true,长度字段设置为0.

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

  • 找出了异常中eoflength的值,
  • 将故障发生的情况联系起来。--

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

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/10476056

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档