我正在尝试创建一个名为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的字符串;包中没有项目!")
我不确定为什么会这样......特别是因为我的预期错误信息确实正确地打印到控制台。在此先感谢您的帮助!
答案 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的值?