Soru Java.lang.reflect.InvocationTargetException neden olabilir?


Eh, neyin neden olabileceğini anlamaya çalıştım ama anlayamıyorum:

Bunu kodumda bir yer var:

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

Şey, bir yöntem çağırmaya çalıştığında, o atar   InvocationTargetException başka bir beklenen istisna yerine (özellikle ArrayIndexOutOfBoundsException).  Hangi yöntemin çalıştırıldığını bildiğimden, bu yöntem koduna doğruca gittim ve atmayı düşündüğü satır için bir try-catch bloğu ekledim. ArrayIndexOutOfBoundsException ve gerçekten attı ArrayIndexOutOfBoundsException beklenildiği gibi. Yine de yukarı çıkarken  bir şekilde değişir InvocationTargetException ve yukarıdaki kodda catch(Exception e)   e InvocationTargetException ve yok ArrayIndexOutOfBoundsException  beklenildiği gibi.

Böyle bir davranışa ne sebep olabilir ya da böyle bir şeyi nasıl kontrol edebilirim?


252
2018-05-16 16:57


Menşei




Cevaplar:


Yöntemi yansımayla çağırarak fazladan bir soyutlama eklediniz. Yansıma katmanı, herhangi bir özel durumu InvocationTargetExceptionbir istisna arasındaki farkı söyleyebilmenizi sağlar aslında yansıma çağrısındaki bir hatadan (örneğin argüman listeniz geçerli değildi) ve aranan yöntemdeki bir hatadan kaynaklanır.

Sadece sebebi InvocationTargetException ve orijinaline ulaşırsın.


278
2018-05-16 17:00



@ user550413: İstisnai kaldırarak ve bunu inceleyerek. Her zaman kendin atabilirsin ve eğer istersen öyle yakala. - Jon Skeet
"İçinde nedenin açılmasının" ne anlama geldiği hakkında merak eden herkes için InvocationTargetException", Keşke şunu kullanarak yazdırdıysanız keşfettim exception.printStackTrace(), sadece üst yarı / normal bölüm yerine "Neden Olduğu:" bölümüne bakın. - Jan
"Unwrapping" ile ilgili açıklamaları eklemek için istisnaları da yakalayabilir ve üzerinde eğer istenirse yeniden oluşturulabilen getCause () yöntemini kullanabilirsiniz. Gibi bir şey try {...} catch (InvocationTargetException ex) { log.error("oops!", ex.getCause()) } veya ...catch... { throw ex.getCause() } - jcadcell
İçin +1 @HJanrs you just look at the "Caused By:" section instead of the top half/normal section - GingerHead
@EJP Aslında düzenleme zaten bir yorum olarak (68 upvotes) Jan tarafından yayınlandı ... Düzenleme açıklaması "yorumlardan öneride bulundu" belirtin. - Jean-François Savard


İstisna

InvocationTargetException - temel yöntem bir istisna atarsa.

Yansıma API'sı ile çağrılan yöntem, bir istisna atarsa ​​(örneğin çalışma zamanı istisnası), yansıma API'sı istisnayı InvocationTargetException.


40
2018-05-16 17:01





Kullan getCause() üzerinde yöntem InvocationTargetException orijinal istisnayı geri almak için


34
2018-06-30 18:32





Method.invoke () Javadoc'undan

Atar: InvocationTargetException - temel yöntem bir istisna atarsa.

Bu yöntem istisna attı eğer yöntem istisna atılır.


18
2018-05-16 17:00



Yani bir çağlayan var sanırım java.lang.reflect.Proxy sarılmış bir nesneyi büyütme örnekleri. Her Proxy özel bir istisna (muhtemelen sarılmış nesnenin attığı) inceleyerek kendi işini kullanarak ele alır. InvocationHandler. Her biri için doğru çağırma işleyicisi / proxy'ye ulaşana kadar bu basamakta dalgalanmanın bir istisnası InvocationHandler, Yakalarım InvocationTargetException, unwrap, sarılmış özel durum olup olmadığını kontrol edin instanceof bununla ele alınacak istisna InvocationHandler. Eğer değilse instanceofBen atacağım Çizelgesi istisna ... doğru? - Abdull
İstenmeyen istisnayı her zaman atacağım. - Peter Lawrey


Bu, özel yöntemde kodun tam satırını yazdıracaktır;

try {

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

} catch (InvocationTargetException e) {

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

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

9
2017-12-22 22:56



Teşekkürler; Bu benim sorunumun yansımanın kendisinde değil, çağrılan yöntemde olduğunu fark etmeme yardımcı oldu. - Jose Gómez


o InvocationTargetException muhtemelen muhtemelen ArrayIndexOutOfBoundsException. Bu yöntemin ne atabileceğini yansıtmadığını söyleyen bir açıklama yoktur. throws Exception yaklaşım, tüm istisnalar yakalanır ve içine sarılır InvocationTargetException.


8
2018-05-16 17:01



Teşekkürler, ama bu (örneğin AssertionError e) ve (Exception e) arasında nasıl farklılık göstereceğim? Eğer her zaman bir istisna arasında ayrıcalık fark etmeden önce her zaman InvocationTargetException alıyorum? - user550413


Bu gibi bir şeyi tanımlar

InvocationTargetException, bir sarılmış bir kontrol istisnasıdır   çağrılan bir yöntem veya kurucu tarafından atılan istisna. Yayınlandığı gibi   1.4, bu istisna genel amaçlı istisna zincirleme mekanizmasına uygun hale getirilmiştir. "Hedef istisnası"   yapım aşamasında sağlanan ve üzerinden erişilen   getTargetException () yöntemi artık neden olarak bilinir ve   Throwable.getCause () yöntemiyle ve aynı zamanda   daha önce bahsedilen "eski yöntem".


2
2017-12-11 16:56





Bu gibi getCause () yöntemini kullanarak özgün istisna sınıfı ile karşılaştırabilirsiniz:

try{
  ...
} catch(Exception e){
   if(e.getCause().getClass().equals(AssertionError.class)){
      // handle your exception  1
   } else {
      // handle the rest of the world exception 
   }
} 

2
2017-11-09 15:12