-1

複数のスレッド間で共有されるベクターがあり、これらのスレッドの1つを使用してこのベクターから読み取ろうとすると、StreamCorruptedExceptionが発生します。

例外のスタックトレースは次のとおりです。

java.io.StreamCorruptedException: invalid stream header: 7371007E at java.io.ObjectInputStream.readStreamHeader(ObjectInputStream.java:801) at java.io.ObjectInputStream.<init>(ObjectInputStream.java:298) at prj.ReadThread.run(ReadThread.java:32

prj.ReadThread.runでこの例外を発生させるコード行は次のとおりです。

ObjectInputStream o = new ObjectInputStream(RS.getInputStream());

さらに情報が必要な場合は教えてください。

4

2 に答える 2

2

スタックトレースは役に立ちませんでしたか?

例外は でスローされたように見えreadStreamHeader()ますが、デバッガーでステップスルーできます。バージョン番号の不一致が疑われます。多くのクラスには警告が含まれています: このクラスのシリアル化されたオブジェクトは、将来の Xxx リリースと互換性がありません。

補遺: @S Kh は有益に次のように報告しています。

この問題は、Java のストリームが原因でした。サーバー上の一意のストリームからパケットを送信していましたObjectOutputStreamが (an )、クライアントでは毎回異なるストリームからデータを受信しましたnew ObjectInputStream。だから私はこの例外を得ました。

于 2012-11-25T11:08:45.627 に答える
1

ベクトルはデフォルトで同期されます。スレッド間でそれらを共有している場合は、実際に実装されている同期ポリシーがプログラムをスレッドセーフにするのに十分であることを確認してください (何らかの同期の存在は、クラスのオールラウンドな同時動作をほとんど示していないためです)。

于 2012-11-25T10:12:11.937 に答える