[java] java.lang.reflect.InvocationTargetException의 원인은 무엇입니까?

글쎄, 나는 그것을 일으킬 수있는 것을 이해하고 읽으려고 노력했지만 그것을 얻을 수는 없다.

내 코드 어딘가에 있습니다.

 try{
 ..
 m.invoke(testObject);
 ..
 } catch(AssertionError e){
 ...
 } catch(Exception e){
 ..
 }

그것은 어떤 메소드를 호출하려고 할 때 InvocationTargetException예상되는 다른 예외 (특히 ArrayIndexOutOfBoundsException) 대신 던집니다
. 실제로 메소드가 호출되는 것을 알다시피 나는이 방법을 코드로 바로 가서 던져 가정 선의 시도-catch 블록에 추가 ArrayIndexOutOfBoundsException하고이 정말 던졌다 ArrayIndexOutOfBoundsException예상대로입니다. 까지 갈 때 그러나 어떻게 든로 변경 InvocationTargetException하고 위의 코드 catch(Exception e)
입니다 전자 InvocationTargetException하지 ArrayIndexOutOfBoundsException
예상대로.

그러한 행동을 유발할 수있는 원인은 무엇입니까?



답변

리플렉션을 사용하여 메소드를 호출하여 추가 추상화 레벨을 추가했습니다. 반사 층은 어떤 예외 랩 InvocationTargetException은 예외 사이의 차이를 알려주는 기능, 실제로 반사 호출 실패로 인한를 (어쩌면 당신의 인수 목록은 예를 들어, 유효하지 않습니다) 및 호출 된 메소드 내에서 오류가 발생했습니다.

내부에서 원인을 풀면 InvocationTargetException원래 원인으로 이동합니다.


답변

다음과 같은 경우 예외가 발생합니다.

InvocationTargetException-기본이되는 메소드가 예외를 throw하는 경우

리플렉션 API로 호출 된 메소드가 예외 (예 : 런타임 예외)를 발생시키는 경우 리플렉션 API는 예외를로 묶습니다 InvocationTargetException.


답변

getCause()메소드를 사용하여 InvocationTargetException원래 예외를 검색하십시오.


답변

Method.invoke ()의 Javadoc에서

InvocationTargetException-기본이되는 메소드가 예외를 throw하는 경우

이 메소드는 호출 된 메소드가 예외를 발생시킨 경우 발생합니다.


답변

그건 InvocationTargetException아마 최대 당신의 포장됩니다 ArrayIndexOutOfBoundsException. 리플렉션을 사용할 때 해당 메소드가 던질 수있는 것을 미리 알 수는 없습니다. 따라서 throws Exception접근 방식을 사용하는 대신 모든 예외가 포착되고 마무리됩니다 InvocationTargetException.


답변

이렇게하면 특정 메소드에 정확한 코드 줄이 인쇄되어 호출되면 예외가 발생합니다.

try {

    // try code
    ..
    m.invoke(testObject);
    ..

} catch (InvocationTargetException e) {

    // Answer:
    e.getCause().printStackTrace();
} catch (Exception e) {

    // generic exception handling
    e.printStackTrace();
}


답변

이것은 다음과 같은 것을 설명합니다.

InvocationTargetException은 호출 된 메소드 또는 생성자에 의해 발생 된 예외를 랩핑하는 점검 된 예외입니다. 릴리스 1.4부터이 예외는 범용 예외 체인 메커니즘을 준수하도록 개선되었습니다. 구성시 제공되고 getTargetException () 메소드를 통해 액세스되는 “대상 예외”는 이제 원인으로 알려져 있으며 Throwable.getCause () 메소드 및 위에서 언급 한 “레거시 메소드”를 통해 액세스 할 수 있습니다.