我正在尝试为泛型类型元素编写一个固定大小的队列。用户可以调用构造函数,提供一个大小,并为该大小创建一个内部数组。(见下文)
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
更合适。有人可以建议吗?
答案 0 :(得分:6)
我认为你应该让insert方法返回boolean,如果插入了对象则返回true,如果队列已满,则返回false。将对象添加到完整队列对我来说似乎不是一个例外情况。
在任何情况下,如果Java API中没有预定义的异常是一个很好的匹配,您可以创建自己的异常类型以最适合这种情况:
public class QueueFullException extends RuntimeException {
// or "extends Exception" if you want it checked
...
}
答案 1 :(得分:3)
队列已满时有四种情况
您应该使用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.Queue的boolean 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);