控制台显示异常消息,但仍然是错误的异常类型 - 为什么?

时间:2017-02-22 03:31:38

标签: java exception expected-exception

我正在尝试创建一个名为bag的抽象数据类型,它基本上使用方法add(int x)获取整数,并使用方法remove()删除任意整数。

然后,我尝试为remove()方法创建一个自定义异常,因为当包中已经没有任何项目时,有可能会删除。因此,我创建了一个异常类:

public class EmptyBagException extends Exception {
    public EmptyBagException(String message) {
        super(message);
    }
}

并继续使用此自定义异常,如下所示:

public int remove() {

    try {
        this.realRemoval();
    } catch (EmptyBagException e){
        System.out.println(e.getMessage());
    }

    return -1;
}

public int realRemoval() throws EmptyBagException {

    if (counter == 0) {
        throw new EmptyBagException("There are no items in the bag!");
    } else {
        ...
    }
}

然后,我尝试通过这样做来测试异常:

@Rule
public ExpectedException thrown = ExpectedException.none(); 

@Test
public void testThree() {

    IBag myBag = new BasicBag();
    myBag.remove();
    thrown.expect(EmptyBagException.class);
    thrown.expectMessage("There are no items in the bag!");

}

不幸的是,这次测试失败了,我收到了消息:

  

java.lang.AssertionError:要抛出的预期测试(sg.com.practice.adt.EmptyBagException和异常的实例,消息包含&#34的字符串;包中没有项目!")

我不确定为什么会这样......特别是因为我的预期错误信息确实正确地打印到控制台。在此先感谢您的帮助!

1 个答案:

答案 0 :(得分:3)

这是因为你实际上没有从remove()中抛出异常:

public int remove() {

    try {
        this.realRemoval();
    } catch (EmptyBagException e){
        System.out.println(e.getMessage());
    }

    return -1;
}

在这种情况下,来自realRemoval()的例外由try...catch块捕获并处理。 realRemoval()抛出异常,然后由您的处理程序捕获,消息被打印,并且就是这样:异常不会被重新抛出,而是返回-1。

如果您希望它重新抛出异常,则必须改为:

public int remove() throws EmptyBagException { // <-- declare throws

    try {
        this.realRemoval();
    } catch (EmptyBagException e){
        System.out.println(e.getMessage());
        throw e; // <-- rethrow
    }

    return -1;

}

或者只是摆脱你的输出信息并让它自然发生:

public int remove() throws EmptyBagException { // <-- declare throws

    this.realRemoval(); // <-- may throw

    return -1;

}

另请注意,您需要在在测试函数中调用thrown之前设置remove() ,就好像remove()抛出一样,然后测试函数将抛出并且实际上没有超过该点来设置thrown

顺便说一句,你是不是要返回realRemoval()而不是-1的值?