0

スレッドセーフなキュー クラスを使用していますが、定義した挿入メソッドに問題があります。Buffer は、開始/終了変数を使用して、キューから追加/削除する場所を知る配列 (elementData) を格納します。スレッドセーフなので、同期メソッドを使用するため、複数のスレッドが同じバッファーを参照できます。

public class Buffer<T> {
    private T[] elementData;                     
    private int elementCount;
    private int start;                                      
    private int end;

    // Additional fields

    // Code to instantiate a Buffer, other methods (e.g. delete)

    public synchronized void insert(T t) throws InterruptedException {
        while (elementCount == elementData.length) {
            wait();
        }
        end = (end + 1) % elementData.length;
        elementData[end] = t;
        elementCount++;
        notifyAll();
    }

    public static void main(String[] args) {
        Buffer<Integer> b = new Buffer();
        b.insert(3);
    }
}

これが私の状況の理解です。挿入などのメソッドが呼び出されたときに、メイン メソッドまたは他のスレッドが呼び出され、中断中に挿入を実行しようとしたときに発生する可能性がある例外をスローできるようにしたいと考えています。しかし、私が理解していないのは、この報告されていない例外が発生する理由です。メソッドの後に「Throws InterruptedException」があれば十分だと思いました。"try" ブロックは必要ですか? 私のtryブロックの試みはすべて失敗したので、このエラーを修正する方法について少し困惑しています.

また、実際のスレッドが実行されていないことも承知しています。この報告されていない例外を修正できたら、それらを実行します。:)助けてくれる人に感謝します。

Buffer.java:56: unreported exception java.lang.InterruptedException; must be caught or declared to be thrown
b.insert(3);
4

1 に答える 1

2

コンパイル例外は、insert(意図的にスローしていなくても) メソッドが InterruptedException をスローする可能性があるためです。そのため、それを呼び出すすべてのメソッドは、エラーが発生しない場合でも、try/catch ブロックを使用する必要があります。

public static void main(String[] args) {
    Buffer<Integer> b = new Buffer();
    try {
        b.insert(3);
    } catch(InterruptedException ie) {
        //error handling
        e.printStackTrace();
    }
}
于 2012-05-09T04:29:50.517 に答える