Почему NativeMethodAccessorImpl объявляет InvocationTargetException - PullRequest
0 голосов
/ 06 октября 2019

Метод вызова NativeMethodAccessorImpl объявляет, что может генерировать IllegalArgumentException или InvocationTargetException

public Object invoke(Object obj, Object[] args)
    throws IllegalArgumentException, InvocationTargetException
{
    // We can't inflate methods belonging to vm-anonymous classes because
    // that kind of class can't be referred to by name, hence can't be
    // found from the generated bytecode.
    if (++numInvocations > ReflectionFactory.inflationThreshold()
            && !ReflectUtil.isVMAnonymousClass(method.getDeclaringClass())) {
        MethodAccessorImpl acc = (MethodAccessorImpl)
            new MethodAccessorGenerator().
                generateMethod(method.getDeclaringClass(),
                               method.getName(),
                               method.getParameterTypes(),
                               method.getReturnType(),
                               method.getExceptionTypes(),
                               method.getModifiers());
        parent.setDelegate(acc);
    }
    return invoke0(method, obj, args);
}
private static native Object invoke0(Method m, Object obj, Object[] args);

Собственный метод создает исключение IllegalArgumentException в некоторыхслучаи, например

Exception in thread "main" java.lang.IllegalArgumentException: argument type mismatch
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)

Но я не вижу никакой возможности бросить InvocationTargetException проверенное исключение

Может InvocationTargetException бытьгенерируется нативным методом invoke0 (который не объявляет исключения)?

Или InvocationTargetException остается из-за обратной совместимости сигнатуры метода / будущей совместимости?

1 Ответ

0 голосов
/ 22 октября 2019

invoke0 может выдать InvocationTargetException:

Exception in Application start method
java.lang.reflect.InvocationTargetException
        at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
        at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)

Например, когда файл ресурсов FXML не найден.

...