我正在使用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

最佳答案

张维(Vic Jang)是对的。您需要将调用包装在try-catch中,然后重新抛出内部异常。

try {
  return method.invoke(webElements, args);
} catch (InvocationTargetException ite) {
  throw ite.getCause();
}

原因是“Method.invoke”在InvocationTargetException中包装了在方法的代码中引发的异常。

java.lang.reflect.Method:



java.lang.reflect.InvocationTargetException:



代理对象的类在其“抛出”之间没有声明InvocationTargetException。这导致UndeclaredThrowableException。

关于java - IndexOutOfBoundsException抛出的UndeclaredThrowableException,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/19690653/

10-11 20:41