6

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

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更合适。有人可以建议吗?

4

6 回答 6

6

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

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

public class QueueFullException extends RuntimeException {
    // or "extends Exception" if you want it checked
    ...
}
于 2013-08-09T07:04:35.173 回答
4

使用 IllegalStateException.It 最适合您的要求。
根据 java docs的定义。

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

根据IllegalArgumentException将不适合您的要求。它在 java文档中的定义说。

抛出以指示方法已传递了非法或不适当的参数

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

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

于 2013-08-09T07:15:06.170 回答
3

队列已满时有四种情况

  1. 返回 false/true 表示 put 尝试是否成功
  2. 抛出异常
  3. 阻塞直到队列已满可选定义超时
  4. 等待指定时间后返回或抛出异常。
  5. 定义不同的方法,分别结合上述场景。例如 BlockingQueue 中的 add 和 offer 方法。

您应该使用 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) {
于 2013-08-09T07:23:45.220 回答
2

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

于 2013-08-09T07:06:43.703 回答
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);
于 2013-08-09T07:09:12.643 回答
-1

根据 List ,当您设置一个不绑定的值时,它会引发 IndexOutOfBoundsException。

    @throws IndexOutOfBoundsException if the index is out of range
    E set(int index, E element);
于 2013-08-09T07:11:42.000 回答