Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/305.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java参数,数组索引错误_Java_Multithreading - Fatal编程技术网

Java参数,数组索引错误

Java参数,数组索引错误,java,multithreading,Java,Multithreading,所以我正在用Java制作一个MIDI程序。我有一个缓冲区,这是我用来从缓冲区获取消息的线程,并将它们传递到一个窗口类中,该类将显示它们 每当我发送一条只有两个参数的消息时,我总是收到一个ArrayIndexOutOfBounds错误。我尝试过使用一个单独的数组和一个if语句,但这两个语句都不起作用。该错误表示它与if语句/第三个参数变量有关 我使用了switch语句和masking来确定接收的是哪种类型的消息,但是带有两个参数而不是三个参数的消息会抛出一个错误,它与数组和参数数量有关 publi

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

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

我使用了switch语句和masking来确定接收的是哪种类型的消息,但是带有两个参数而不是三个参数的消息会抛出一个错误,它与数组和参数数量有关

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;
                }
            }
        }
    }
}

你能提供的任何建议都会非常有用

如果您的
If(getMessages[2]!=0)
的目的是检查数组中是否有
第三个元素,那么这将不起作用

请参见以下数组创建代码:-

byte[] getMessages = bufferObj.get();
现在,
bufferObj.get()
将只提供
2个元素
数组,如果只有2个元素。因此,数组的大小没有明确定义。它取决于
bufferObj.get()
返回的内容。因此,如果元素数仅为
2
,则数组中不会有任何
2索引。这就是为什么在
2个元素的情况下会出现
ArrayIndexOutOfBounds
异常

您可以通过检查获得的数组长度来检查第三个元素是否存在:-

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

buffer
可以同时被其他线程修改吗?天哪,我有时候真是个白痴。我想我的大脑快死了!非常感谢@库加。哈哈。别担心。有时也会发生。不客气:)