为什么我在 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.
简而言之,写入套接字的内容与代码尝试读取的内容不匹配。要弄清楚这一点,您需要:
- 找出异常中
eof
和length
的值,并且 - 确定发生故障的情况。
然后,将您的代码与编写对象的代码进行比较,并(使用上面的证据)找出不匹配的地方。
关于run 方法中的 java.io.OptionalDataException?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10476056/