【问题标题】:java.lang.ArrayIndexOutOfBoundsException: -1java.lang.ArrayIndexOutOfBoundsException:-1
【发布时间】:2013-07-03 07:13:34
【问题描述】:

我有一个 Java 应用程序,其中包含在不同 Java 类中创建的两个线程。一个线程用于写入图像文件,另一个线程同时读取同一个文件。两个线程同时运行。

但经过几次尝试,线程被阻塞并显示以下异常:

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 类中同步这两个线程?

【问题讨论】:

  • 你能告诉我们你的代码吗?
  • 当时'elementData'的大小是多少,能调试一下
  • 它是一个很大的应用程序,所以我不能分享它
  • @rachana,在这种情况下,我们无法为您提供适当的帮助
  • 听起来像一个竞争条件en.wikipedia.org/wiki/Race_condition

标签: java linux multithreading image image-processing


【解决方案1】:

java.lang.ArrayIndexOutOfBoundsException 是由代码试图访问某个不存在的数组值引起的。

例如:

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 个数组,因此您会遇到异常。

【讨论】:

  • 我在两个不同的 java 类中有两个线程。我怎样才能同步它们?你能给我举个例子吗?
  • 这是一个完全不同的问题,但您应该查看此链接:docs.oracle.com/javase/tutorial/essential/concurrency/sync.html
  • @JREN 只是技术,但array[6].toString() 将访问 myarray[] 中的第 7 项;)
【解决方案2】:

如果您尝试读取同一文件,请确保在访问共享资源时已在同一对象上同步线程。这可能会抛出 ArrayIndexOutOfBoundsException

【讨论】:

    猜你喜欢
    • 2018-04-26
    • 1970-01-01
    • 2013-11-19
    • 1970-01-01
    • 1970-01-01
    • 2014-05-20
    • 2018-07-14
    • 2017-09-23
    • 2023-04-10
    相关资源
    最近更新 更多