Bem, tentei entender e ler o que poderia causar isso, mas simplesmente não consigo:
Eu tenho isso em algum lugar no meu código:
try{
..
m.invoke(testObject);
..
} catch(AssertionError e){
...
} catch(Exception e){
..
}
O problema é que, quando tenta invocar algum método, lança em
InvocationTargetException
vez de outra exceção esperada (especificamente ArrayIndexOutOfBoundsException
). Como eu realmente sei qual método é chamado, fui direto para esse código de método e adicionei um bloco try-catch para a linha que deveria ser lançada ArrayIndexOutOfBoundsException
e realmente foi lançada ArrayIndexOutOfBoundsException
conforme o esperado. No entanto, ao subir, de alguma forma, muda para InvocationTargetException
e no código acima catch(Exception e)
e é InvocationTargetException
e não ArrayIndexOutOfBoundsException
o esperado.
O que poderia causar esse comportamento ou como posso verificar isso?
fonte
InvocationTargetException
", descobri que, se você a imprimiu usandoexception.printStackTrace()
, basta olhar para a seção "Causada por:" em vez da metade superior / normal.try {...} catch (InvocationTargetException ex) { log.error("oops!", ex.getCause()) }
ou...catch... { throw ex.getCause() }
you just look at the "Caused By:" section instead of the top half/normal section
A exceção é lançada se
Portanto, se o método, que foi chamado pela API de reflexão, lançar uma exceção (exceção de tempo de execução, por exemplo), a API de reflexão envolverá a exceção em um
InvocationTargetException
.fonte
Use o
getCause()
método noInvocationTargetException
para recuperar a exceção original.fonte
No Javadoc do Method.invoke ()
Essa exceção é lançada se o método chamado lançou uma exceção.
fonte
java.lang.reflect.Proxy
instâncias aumentando um objeto empacotado. CadaProxy
um manipula graciosamente uma exceção específica (possivelmente lançada pelo objeto quebrado) usando sua própriaInvocationHandler
. Para que uma exceção percorra essa cascata até atingir o manipulador / proxy de chamada correto, em cada uma delasInvocationHandler
eu capturariaInvocationTargetException
, desembrulharia e verificaria se a exceção agrupada éinstanceof
a exceção a ser tratada por issoInvocationHandler
. Se não for uminstanceof
, eu lançaria a exceção desembrulhada ... certo?Isso
InvocationTargetException
provavelmente está encerrando o seuArrayIndexOutOfBoundsException
. Não há como dizer antecipadamente ao usar a reflexão o que esse método pode oferecer - portanto, em vez de usar umathrows Exception
abordagem, todas as exceções estão sendo capturadas e agrupadasInvocationTargetException
.fonte
Isso imprimirá a linha exata de código no método específico que, quando chamado, gerou a exceção:
fonte
Isso descreve algo como,
fonte
Você pode comparar com a exceção original Class usando o método getCause () como este:
fonte
Eu tive um
java.lang.reflect.InvocationTargetException
erro de uma instrução chamando um objeto logger em um externoclass
dentro de um blocotry
/catch
no meuclass
.Percorrendo o código no depurador Eclipse & passar o mouse sobre a declaração logger vi o logger
object
foinull
(algumas constantes externos necessários para ser instanciado no topo da minhaclass
).fonte
Essa exceção é lançada se o método subjacente (método chamado usando Reflexão) lança uma exceção.
Portanto, se o método, que foi chamado pela API de reflexão, lançar uma exceção (como por exemplo, exceção de tempo de execução), a API de reflexão envolverá a exceção em um InvocationTargetException.
fonte
Eu estava enfrentando o mesmo problema. Eu usei e.getCause (). GetCause () e descobri que era por causa de parâmetros errados que eu estava passando. Houve nullPointerException na busca do valor de um dos parâmetros. Espero que isso ajude você.
fonte
fonte
O erro desapareceu depois que eu fiz Limpar-> Executar xDoclet-> Executar xPackaging.
No meu espaço de trabalho, em eclipse.
fonte