0

我正在使用线程安全队列类,并且我定义的插入方法有问题。缓冲区存储一个数组(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);
    }
}

这是我对情况的理解。当调用诸如 insert 之类的方法时,我们希望能够抛出一个异常,该异常可能会在 main 方法或其他线程被调用并尝试在其挂起时执行 insert 时发生。但我不明白为什么我会得到这个未报告的异常。我认为在方法之后有一个“抛出 InterruptedException”就足够了。我需要一个“尝试”块吗?我对 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 回答