Java参数,数组索引错误
所以我正在用Java制作一个MIDI程序。我有一个缓冲区,这是我用来从缓冲区获取消息的线程,并将它们传递到一个窗口类中,该类将显示它们 每当我发送一条只有两个参数的消息时,我总是收到一个Java参数,数组索引错误,java,multithreading,Java,Multithreading,所以我正在用Java制作一个MIDI程序。我有一个缓冲区,这是我用来从缓冲区获取消息的线程,并将它们传递到一个窗口类中,该类将显示它们 每当我发送一条只有两个参数的消息时,我总是收到一个ArrayIndexOutOfBounds错误。我尝试过使用一个单独的数组和一个if语句,但这两个语句都不起作用。该错误表示它与if语句/第三个参数变量有关 我使用了switch语句和masking来确定接收的是哪种类型的消息,但是带有两个参数而不是三个参数的消息会抛出一个错误,它与数组和参数数量有关 publi
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
可以同时被其他线程修改吗?天哪,我有时候真是个白痴。我想我的大脑快死了!非常感谢@库加。哈哈。别担心。有时也会发生。不客气:)