2013-07-03 2 views
2

다른 Java 클래스로 작성된 두 개의 스레드가 포함 된 Java 응용 프로그램이 하나 있습니다. 하나의 스레드는 이미지 파일을 쓰는 데 사용되고 다른 하나는 같은 파일을 동시에 읽는 것입니다. 두 스레드가 동시에 실행 중입니다. java.lang.ArrayIndexOutOfBoundsException : -1

그러나 스레드가 차단되고 다음과 같은 예외가 표시됩니다 몇 가지 시도 후

: 응용 프로그램 자체를 종료이 예외 후

java.lang.ArrayIndexOutOfBoundsException: -1 
at java.util.ArrayList.elementData(ArrayList.java:371) 
at java.util.ArrayList.get(ArrayList.java:384) 
at com.sun.imageio.plugins.jpeg.JPEGImageReader.checkTablesOnly(JPEGImageReader.java:373) 
at com.sun.imageio.plugins.jpeg.JPEGImageReader.gotoImage(JPEGImageReader.java:476) 
at com.sun.imageio.plugins.jpeg.JPEGImageReader.readHeader(JPEGImageReader.java:597) 
at com.sun.imageio.plugins.jpeg.JPEGImageReader.readInternal(JPEGImageReader.java:1054) 
at com.sun.imageio.plugins.jpeg.JPEGImageReader.read(JPEGImageReader.java:1034) 
at javax.imageio.ImageIO.read(ImageIO.java:1448) 
at javax.imageio.ImageIO.read(ImageIO.java:1308) 
    at java.lang.Thread.run(Thread.java:722) 

. 이 문제를 해결하는 방법?

어떻게 두 개의 서로 다른 Java 클래스에서이 두 스레드를 동기화 할 수 있습니까?

+0

코드를 알려주시겠습니까? –

+0

그 시간에 'elementData'의 크기는 얼마입니까? – gnanz

+0

큰 응용 프로그램을 디버그하므로 공유 할 수 없습니다 – rachana

답변

2

존재하지 않는 특정 배열 값에 액세스하려고하는 코드 때문에 발생합니다. 예를 들어

:

String[] myArray = new String[5]; 

for(int i = 0; i < myArray.length; i++) { 
    myArray[i] = "Value: " + i; 
} 

System.out.println(array[6].toString()); 

배열 만 5 길고 존재하지 않는 6에 액세스하기 위해 노력하고 있기 때문에, 당신은 예외를 얻을 수 있습니다.

+0

두 개의 서로 다른 Java 클래스에 두 개의 스레드가 있습니다. 어떻게 동기화 할 수 있습니까? 몇 가지 예를 안내해 주시겠습니까? – rachana

+0

그건 완전히 다른 문제입니다.하지만 http://docs.oracle.com/javase/tutorial/essential/concurrency/sync.html – JREN

+0

@JREN 그냥 기술적 인 내용이지만'array [6]입니다. toString()'myarray [];의 7 번째 항목에 액세스합니다. –

1

같은 파일을 읽으려는 경우 공유 리소스에 액세스 할 때 같은 개체에 스레드를 동기화했는지 확인하십시오. 이 경우 ArrayIndexOutOfBoundsException이 throw 될 수 있습니다.

관련 문제