0

java.io.OptionalDataExceptionrun メソッドで受け取るのはなぜですか?

ObjectInputStream は項目とユーザーを数回読み取り、その後 でクラッシュしOptionalDataExceptionます。関連していると思いますEOFException

新しいソケットが作成されたときにメッセージを出力します objectInputStream の値を出力します メッセージも出力します

スタック トレース + メッセージ

新しいソケットが作成されました
新しいソケットが作成されました 新しいソケットが作成さ
れました
これが ObjectInputStream です :java.io.ObjectInputStream@1430b5c これ
がメッセージです :REA:ITEM:
ここが ObjectInputStream です :java.io.ObjectInputStream@1decdec <
ここがメッセージです :ADD:ITEM:
New socket作成された
新しいソケットが作成されました
ObjectInputStream は次のとおりです:java.io.ObjectInputStream@b2fd8fメッセージ
は次の とおりです:REA:ITEM:
新しいソケットが作成され                    まし                    たfedaih.SocketTask.run (                    SocketTask.java:55) のreadObject (不明なソース)




                   java.lang.Thread.run(Unknown Source)で
新しいソケットが作成されました
ここに ObjectInputStream があります:java.io.ObjectInputStream@1c39a2d
ここにメッセージがあります:REA:USER:
ここに ObjectInputStream があります:java.io.ObjectInputStream@13bad12
ここにメッセージがあります:ADD :USER:
新しいソケットが作成されました
新しいソケットが作成されました
これが ObjectInputStream です :java.io.ObjectInputStream@eb7859 これ
がメッセージです :REA:USER:
java.io.OptionalDataException
                   at java.io.ObjectInputStream.readObject0(Unknown Source)
                   at java.io.
                   fedaih.SocketTask.run (SocketTask.java:55) のObjectInputStream.readObject (不明なソース)
                   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 では、例外について次のように説明されています。

未読のプリミティブ データ、またはストリーム内のシリアル化されたオブジェクトに属するデータの終わりが原因で、オブジェクトの読み取り操作が失敗したことを示す例外。この例外は、次の 2 つの場合にスローされる可能性があります。

  • ストリーム内の次の要素がプリミティブ データであるときに、オブジェクトを読み取ろうとしました。この場合、OptionalDataException の length フィールドは、ストリームからすぐに読み取り可能なプリミティブ データのバイト数に設定され、eof フィールドは false に設定されます。
  • クラス定義の readObject または readExternal メソッドによって、データ コンシューマブルの末尾を超えて読み取ろうとしました。この場合、OptionalDataException の eof フィールドは true に設定され、length フィールドは 0 に設定されます。

つまり、ソケットに書き込まれたものとコードが読み取ろうとしているものとの間に不一致があります。これを理解するには、次のことを行う必要があります。

  • eofおよびの値がlength例外であるかを調べます。
  • 障害が発生している状況を特定します。

次に、作成したコードとオブジェクトを記述したコードを比較し、(上記の証拠を使用して) 不一致の原因を突き止めます。

于 2012-05-07T03:55:01.710 に答える