当用户尝试添加到完整容器时抛出的异常

时间:2013-08-09 07:01:08

标签: java exception queue

我正在尝试为泛型类型元素编写一个固定大小的队列。用户可以调用构造函数,提供一个大小,并为该大小创建一个内部数组。(见下文)

class FixedSizeQ<E>{
    private E[] q;
    private int N;

    public FixedSizeQ(int max) {
        super();
        q = (E[]) new Object[max];
        N = 0;
    }
..
}

我想为上面定义一个isEmpty()和isFull()方法以及一个insert()方法。如果客户端试图将元素添加到已经完整的数组中,我想抛出一个异常。 javadocs,我认为IllegalStateException将是抛出的正确例外。

public boolean isFull(){
    return N == q.length;
}
public void insert(Item item){
    if(isFull()){
        throw new IllegalStateException("queue full");
    }
    ...     
}

我想知道我的理解是否正确。有人建议IllegalArgumentException更合适。有人可以建议吗?

6 个答案:

答案 0 :(得分:6)

我认为你应该让insert方法返回boolean,如果插入了对象则返回true,如果队列已满,则返回false。将对象添加到完整队列对我来说似乎不是一个例外情况。

在任何情况下,如果Java API中没有预定义的异常是一个很好的匹配,您可以创建自己的异常类型以最适合这种情况:

public class QueueFullException extends RuntimeException {
    // or "extends Exception" if you want it checked
    ...
}

答案 1 :(得分:3)

队列已满时有四种情况

  1. 返回false / true表示放置尝试成功与否
  2. 抛出异常
  3. 阻止直到队列已满,可选择定义超时
  4. 等待指定的时间后返回或抛出异常。
  5. 定义不同的方法,分别包含上述方案。 例如,BlockingQueue中的add and offer方法。
  6. 您应该使用Bounded BlockingQueue或查看它的实现。

    是IllegalStateException更合适。

    因为它也在ArrayBlockingQueue实现中使用

    /**
     * Inserts the specified element at the tail of this queue if it is
     * possible to do so immediately without exceeding the queue's capacity,
     * returning <tt>true</tt> upon success and throwing an
     * <tt>IllegalStateException</tt> if this queue is full.
     *
     * @param e the element to add
     * @return <tt>true</tt> (as specified by {@link Collection#add})
     * @throws IllegalStateException if this queue is full
     * @throws NullPointerException if the specified element is null
     */
    public boolean add(E e) {
    

答案 2 :(得分:2)

使用IllegalStateException。最符合您的要求 通过java docs的定义。

  

IllegalStateException表示在非法或不适当的时间调用了某个方法。

根据IllegalArgumentException不符合您的要求。它在java docs中的定义说。

  

抛出表示方法已被传递非法或不适当的参数

API中的示例是java.util.Queueboolean add(E e)方法。

  

add()抛出IllegalStateException - 如果由于容量限制而无法在此时添加元素

答案 3 :(得分:1)

当定义了错误的内部属性时,你抛出IllegalStateException,因此无法进一步工作。
当用户在参数化对象时出错,则抛出IllegalArgumentException 在我看来,我会选择IllegalStateException,因为另一个可能会建议尝试推入队列的元素类型错误。
根据Javadoc: IllegalStateException表示在非法或不适当的时间调用了某个方法。换句话说,Java环境或Java应用程序未处于所请求操作的适当状态 同时,抛出IllegalArgumentException表示方法已被传递为非法或不恰当的参数。

答案 4 :(得分:0)

尝试自己的,你可以通过扩展Exception类

来创建新的异常
class NoSpaceToInsert extends Exception
    {
        String message;
        int code;

        public NoSpaceToInsert(int errorCode, String errorMessage)
        {
            message = errorMessage;
            code = errorCode;
        }

        public String toString()
        {
            return "ErrorCode" + code + "ErrorMessage" + message;

        }
    }

现在 扔

throw new NoSpaceToInsert(errorCode, errorMessage);

答案 5 :(得分:-1)

根据List,当你设置一个超出bond的值时,它会抛出一个IndexOutOfBoundsException。

    @throws IndexOutOfBoundsException if the index is out of range
    E set(int index, E element);