Java参数,数组索引错误

时间:2012-12-02 16:23:13

标签: java multithreading

所以我用Java制作一个MIDI程序。我有一个缓冲区,这是我用来从缓冲区获取消息的线程,并将它们传递给将显示它们的窗口类。

每当我发送只有两个参数的消息时,我都会收到ArrayIndexOutOfBounds错误。我尝试过使用单独的数组和if语句,但似乎都不起作用。该错误表明它与if语句/第三个参数变量有关。

我已经使用了switch语句以及屏蔽来确定正在接收哪种类型的消息,但是那些带有两个参数而不是三个的消息会抛出错误,它与数组和参数数量有关

public class DisplayThread extends Thread {

    Buffer bufferObj;
    MidiMonitorWindow window = new MidiMonitorWindow("MIDI Devices");

    DisplayThread(Buffer bufferObj) {

        this.bufferObj = bufferObj;

    }

    public void run() {

        while (true) {

            byte[] getMessages = bufferObj.get();

            if (getMessages != null) {

                int statusValue = getMessages[0] & 0xF0;
                int [] paramArray = new int[3];

                paramArray[0] = getMessages [0] & 0xFF;
                paramArray[1] = getMessages [1] & 0xFF; 
                if (getMessages[2] != 0){
                    paramArray[2] = getMessages [2] & 0xFF;
                }

                switch (statusValue) {

                    case NOTE_OFF:
                        System.out.println("Note Off");
                        window.showNoteOff(paramArray[0], paramArray[1], paramArray[2]);
                        break;

                    case NOTE_ON:
                        System.out.println("Note On");
                        window.showNoteOn(paramArray[0], paramArray[1], paramArray[2]);
                        break;

                    case POLY_PRESSURE:
                        System.out.println("Poly Pressure");
                        window.showPolyKeyPressure(paramArray[0], paramArray[1], paramArray[2]);
                        break;

                    case CONTROL_CHANGE:
                        System.out.println("Control Change");
                        window.showControlChange(paramArray[0], paramArray[1], paramArray[2]);
                        break;

                    case PROGRAM_CHANGE:
                        System.out.println("Program Change");
                        window.showProgramChange(paramArray[0], paramArray[1]);
                        break;

                    case CHANNEL_PRESSURE:
                        System.out.println("Channel Pressure");
                        window.showChannelPressure(paramArray[0], paramArray[1]);
                        break;

                    case PITCH_BEND:
                        System.out.println("Pitch Bend");
                        window.showPitchBend(paramArray[0], paramArray[1], paramArray[2]);
                        break;

                    default:
                        System.out.println("System Message");
                        window.showSystemExclusive();
                        break;
                }
            }
        }
    }
}

您提供的任何建议都会非常有用!

1 个答案:

答案 0 :(得分:1)

如果if (getMessages[2] != 0)的目的是检查阵列中是否有3rd element,那么这将无效。

请参阅此阵列创建代码: -

byte[] getMessages = bufferObj.get();

现在,bufferObj.get()只会给你2 element数组,如果只有2个元素。因此,未明确定义数组的大小。这取决于bufferObj.get()返回的内容。因此,如果元素的数量仅为2nd index,则数组中不会有2。这就是为什么ArrayIndexOutOfBounds会出现2 elements异常的原因。

您可以通过检查所获得阵列的长度来检查3rd element是否存在: -

if (getMessages.length > 2) {
    paramArray[2] = getMessages [2] & 0xFF;
}