0

だから私はJavaでMIDIプログラムを作っています。バッファがあります。これは、バッファからメッセージを取得し、それらを表示するウィンドウクラスに渡すために使用しているスレッドです。

ArrayIndexOutOfBoundsパラメータが2つしかないメッセージを送信すると、エラーが発生し続けます。別の配列とifステートメントを使用してみましたが、どちらも機能しないようです。エラーは、ifステートメント/3番目のパラメーター変数と関係があることを示しています。

受信しているメッセージのタイプを判別するためにswitchステートメントとマスキングを使用しましたが、3つではなく2つのパラメーターを持つメッセージはエラーをスローし、配列とパラメーターの数に関係があります。

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

あなたが提供できるアドバイスは最も役に立ちます!

4

1 に答える 1

1

thereの目的が配列if (getMessages[2] != 0)に a があるかどうかを確認することである3rd element場合、それは機能しません。

配列作成のこのコードを参照してください: -

byte[] getMessages = bufferObj.get();

これで、要素が 2 つしかない場合にのみ、配列がbufferObj.get()提供されます。2 elementしたがって、配列のサイズは明示的に定義されていません。それは何をbufferObj.get()返すかによって異なります。2nd indexしたがって、要素の数がちょうど の場合、配列には何もありません2。そのためArrayIndexOutOfBounds、の場合に例外が発生し2 elementsます。

3rd element取得した配列の長さを確認することで、存在を確認できます。

if (getMessages.length > 2) {
    paramArray[2] = getMessages [2] & 0xFF;
}
于 2012-12-02T16:28:06.390 に答える