所以我用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;
}
}
}
}
}
您提供的任何建议都会非常有用!
答案 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;
}