从流中读取时IndexOutOfBoundsException

时间:2013-10-29 08:49:16

标签: java io

我编写了一个Java方法,通过串口向远程设备发送指令,并获得已知的字节数作为答案。代码使用librxtx-java库在RaspberryPi上运行。验证远程设备发送预期长度的答案。

下面的代码是此方法的最后一部分,其中RaspberryPi等待答案的所有字节,直到给定时间“t_max”。

代码在System.arraycopy期间抛出IndexOutOfBoundsException。如果我通过try ... catch包装arraycopy指令并在catch处打印出指针变量,那确实存在索引溢出。

但是,如果我取消注释打印出指针值的行,则不再有异常。即使用System.out.println("X");替换此行也会使异常消失,但例如System.out.print("X");则不行。

我尝试将变量更改为volatile但不再运气。如何打印到终端改变变量的值?

long t0 = System.currentTimeMillis();
long t = t0;
byte[] answer = new byte[answerLength];
byte[] readBuffer = new byte[answerLength];
int numBytes = 0;
int answerPointer = 0;
while (t - t0 < t_max) {
    try {
        if (inputStream.available() > 0) {
            numBytes = inputStream.read(readBuffer);
        }
    } catch (Exception e) {
    }

    if (numBytes > 0) {
        // System.out.println("answerPointer="+answerPointer);
        System.arraycopy(readBuffer, 0, answer, answerPointer, numBytes);
        answerPointer = answerPointer + numBytes;
    }

    if (answerPointer == answerLength) {
        return (answer);
    }

    t = System.currentTimeMillis();
}

2 个答案:

答案 0 :(得分:0)

您是否尝试过验证输出流和输入流是否以任何方式链接?可能是输入流正在从输出流中读取,而'\ n'(新行)正在用作流字符的结尾。您是否可以尝试打印到字节数组输出流周围的打印流包装而不是标准输出,并查看执行ps.println(“X”)是否会导致异常?如果它确实导致异常,则可能标准输出和输入流被链接,这就是为什么做一个System.out.println(“X”)会使异常消失。

此外,volatile关键字用于线程的上下文中。它不会在单个线程环境中产生任何影响。

答案 1 :(得分:0)

如果代码inputStream.available()while (t - t0 < t_max)个变量numBytesreadBuffer的第二次迭代时抛出异常,则使用旧值进行初始化。尝试将块while (t - t0 < t_max)中的所有代码包装到try {} catch {}中,不要隐藏异常。