2012-12-02 50 views
0

所以我正在Java中製作一個MIDI程序。我有一個緩衝區,這是我用來從緩衝區中獲取消息的線程,並將它們傳遞給將顯示它們的窗口類。Java paremeters,數組索引錯誤

每當我發送一個只有兩個參數的消息時,我總是收到一個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

可以'buffer'通過同時一些其他線程修改? –

回答

1

如果您的if (getMessages[2] != 0)的目的是檢查數組中是否存在3rd element,那麼這將不起作用。

見數組創建的驗證碼 -

byte[] getMessages = bufferObj.get(); 

現在,bufferObj.get()只會給你2 element數組,如果只有2個元素。所以,數組的大小沒有明確定義。這取決於bufferObj.get()的回報。因此,如果元素的數量僅爲2,那麼陣列中將不會有任何2nd index。這就是爲什麼你在2 elements的情況下得到ArrayIndexOutOfBounds例外。

您可以通過檢查獲得的數組的長度檢查的3rd element存在: -

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

上帝我有時候是個白癡。我認爲我的大腦快死了!非常感謝! – Kuga

+0

@Kuga。哈哈。別擔心。它有時會發生。不客氣:) –

+0

@Kuga ..您可以通過點擊旁邊的箭頭標記此答案爲已接受。 –