8

私はデコレータ パターンを使用して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
4

2 に答える 2

3

私はコメントするのに十分な評判を持っていません。あなたの問題はこれに非常に似ているようです

そこで解決策を見て、それが機能するかどうかを確認できます。

つまり、、例外、およびそれmethod.invokeを再度ラップする必要があります。try{}catchthrow

于 2013-11-22T05:07:39.783 に答える