我是java的新手。 我做了一个实现FIFO的类。我使用LinkedList来强制它。 我想知道当我的类Fifo的用户尝试从列表中删除元素时,我应该抛出什么异常,以及如何正确地执行此操作。
import java.util.*;
class Fifo<E>
{
private List<E> list = new LinkedList<E>();
public void add(E element)
{
list.add(element);
}
public E remove() throws IllegalStateException
{
if(list.isEmpty())
throw new IllegalStateException();
else
return list.remove(0);
}
}
使用它的一个例子是有一个订单队列的餐馆。
class Restaurant
{
static public void main(String[] args)
{
Fifo<Order> f = new Fila<Order>();
f.add(new Order("soup"));
try
{
System.out.println(f.remove().toString());
System.out.println(f.remove().toString());
}
catch(IllegalStateException e)
{
System.out.println("There is no more orders.");
}
}
}
有必要成为RunTimeException吗? 在这种情况下,我的班级用户可以处理问题,只是告诉系统用户没有更多订单,而不退出系统。
感谢。
答案 0 :(得分:4)
你可以抛出java.util.NoSuchElementException,因为它在Collection framework中完成了
答案 1 :(得分:1)
您可以使用您想要的任何类型的异常,甚至可以创建自己的异常。
内置类使用运行时异常,因为在任何地方尝试/捕获都会令人沮丧,并且程序员不应该尝试删除元素而不检查是否有首先要删除的元素。
答案 2 :(得分:0)
底层的java集合使用NoSuchElementException这是在底层集合中完成的 - 实际上,你不需要专门抛出它,它将默认发生。一般来说,关于异常,您应该理解应该取消选中这种类型的异常 - 它仅在运行时知道,而不是在编译时。对此的讨论在文档here
中答案 3 :(得分:0)
为了与Java API的其余部分保持一致,我将使用NoSuchElementException
(在java.util中)。
由于调用者通常应该在尝试弹出队列之前验证队列是否为空,这样的错误情况会指示编程错误,在这种情况下我们通常使用RuntimeException。
如果您确实使用了检查异常(即不是RuntimeException的子代),则调用者将被强制使用try-catch或throws子句来处理该情况,但没有真正的好处。