我正在使用装饰器模式List<WebElement>
。这种装饰的一部分需要使用代理。
当我get(index)
使用超出范围的索引调用时,它会引发IndexOutOfBounds
异常,然后由代理捕获,并用UndeclaredThrowableException
.
我的理解是,只有在检查异常 时才应该这样做。IndexOutOfBounds
是一个未经检查的异常,那为什么要包装呢?
即使我添加throws IndexOutOfBounds
到我的invoke
函数中,它仍然会被包装。
这是我的代码:
@SuppressWarnings("unchecked")
public WebElementList findWebElementList(final By by){
return new WebElementList(
(List<WebElement>) Proxy.newProxyInstance(this.getClass().getClassLoader(),
new Class<?>[] { List.class }, new InvocationHandler() {
// Lazy initialized instance of WebElement
private List<WebElement> webElements;
public Object invoke(Object proxy, Method method, Object[] args)
throws Throwable {
if (webElements == null) {
webElements = findElements(by);
}
return method.invoke(webElements, args);
}
}), driver);
}
这是我的堆栈跟踪的一部分:
java.lang.reflect.UndeclaredThrowableException
at com.sun.proxy.$Proxy30.get(Unknown Source)
at org.lds.ldsp.enhancements.WebElementList.get(WebElementList.java:29)
...
Caused by: java.lang.IndexOutOfBoundsException: Index: 1, Size: 1
at java.util.ArrayList.rangeCheck(ArrayList.java:604)
at java.util.ArrayList.get(ArrayList.java:382)
... 41 more