gpt4 book ai didi

java - IndexOutOfBoundsException 抛出的 UndeclaredThrowableException

转载 作者:塔克拉玛干 更新时间:2023-11-03 03:40:11 25 4
gpt4 key购买 nike

我正在为 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.方法:

Throws:
...
InvocationTargetException - if the underlying method throws an exception.

java.lang.reflect.InvocationTargetException:

InvocationTargetException is a checked exception that wraps an exception thrown by an invoked method or constructor.

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

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

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com