在这种情况下,我应该如何处理异常?

时间:2015-10-26 19:07:36

标签: java exception exception-handling

我是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吗? 在这种情况下,我的班级用户可以处理问题,只是告诉系统用户没有更多订单,而不退出系统。

感谢。

4 个答案:

答案 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子句来处理该情况,但没有真正的好处。