2012-11-25 3 views
-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()); 

인지 확인 코드 줄 알려주세요 : 여기

는 예외의 스택 트레이스입니다 나를.

+3

코드 및 예외의 전체 스택 추적을 표시하십시오. Vector에서 읽을 때 어떻게 예외를 얻을 수 있는지 정말로 모르겠다. –

+2

Vector의 어떤 것도 그 예외를 throw 할 수 없습니다. 문제는 그것이 당신이 생각하는 곳이 아닙니다. – assylias

+0

'java.util.Vector '? – trashgod

답변

2

stacktrace가 도움이되지 않았습니까?

예외는 디버거에서 단계별로 실행할 수있는 readStreamHeader()에 표시됩니다. version number 불일치가 의심됩니다. 많은 클래스에는 가 포함되어 있습니다. 경고 :이 클래스의 직렬화 된 객체는 향후 Xxx 릴리즈와 호환되지 않습니다.

부록 :

문제 때문에 자바에서 스트림이었다 : @S KH 유용하게 다음과 같은보고합니다. 서버의 고유 한 스트림 (ObjectOutputStream)에서 패킷을 보내고 있지만 각 패킷에 대해 new ObjectInputStream을 통해 클라이언트에서 매번 다른 스트림의 데이터를 받았습니다. 그래서 나는이 예외를 얻었다.

+0

버전 번호에 대해 자세히 알려주십시오. –

+0

책의 장보다 적지 않습니다. _class 버전 _ 및 _serial 버전 UID가 일치해야합니다. Bloch, Effective Java_, Chapter 11, Item 74를 참조하십시오. 편집 : 디버거는 당신에게 무엇을 보여 줍니까? – trashgod

+0

답장을 보내 주셔서 감사합니다. –

1

기본적으로 벡터는 동기화됩니다. 스레드간에 공유하는 경우 실제로 구현하는 동기화 정책이 프로그램을 스레드 안전으로 만들기에 충분한 지 확인하십시오 (일부 동기화가 클래스의 모든 동시 동작을 거의 나타내지 않으므로)

+0

아마도 내 질문에 잘못 대답했습니다. 당신 말이 맞아요. 하지만이 예외가있는 문제는 내 프로그램에서 소켓을 사용하고 있는데 주된 문제는 소켓의 GetInputStream()을 사용하여 개체를 읽길 원할 때이 예외가 throw된다는 것입니다. –

+0

@ user1850901 예외 코드 – Antony

+1

과 함께 코드를 게시 할 수 있습니다. 예외를 제외하고는 이름을 제외하고는 알 수 있습니다. 일부 Java 코드에서는 소켓을 사용하는 것을 제외하고는 아무것도 알지 못합니다. 왜이 예외가 생길까요? 우리가 말할 수있는 유일한 것은 스트림이 손상 되었기 때문에이 예외가 발생한다는 것입니다. –

관련 문제