Bạn đã thêm một mức độ trừu tượng bằng cách gọi phương thức với sự phản chiếu. Lớp phản chiếu bao bọc bất kỳ ngoại lệ nào trong InvocationTargetException, cho phép bạn phân biệt sự khác biệt giữa một ngoại lệ thực tế gây ra bởi một lỗi trong cuộc gọi phản chiếu (ví dụ, có thể danh sách đối số của bạn không hợp lệ) và lỗi trong phương pháp gọi là.
Chỉ cần mở ra nguyên nhân trong InvocationTargetException và bạn sẽ tìm đến nguyên nhân ban đầu.
Sử dụng phương thức getCause() trên InvocationTargetException để lấy ngoại lệ ban đầu.
Ngoại lệ được ném nếu
InvocationTargetException - nếu phương thức cơ bản ném ngoại lệ.
Vì vậy, nếu phương thức, được gọi bằng API phản chiếu, sẽ ném một ngoại lệ (ví dụ ngoại lệ thời gian chạy), API phản chiếu sẽ bao bọc ngoại lệ thành InvocationTargetException.
Từ Javadoc của Phương thức.invoke ()
Ném: InvocationTargetException - nếu phương thức cơ bản ném ngoại lệ.
Ngoại lệ này được ném nếu phương thức được gọi là ngoại lệ.
Điều này sẽ in dòng mã chính xác trong phương thức cụ thể, khi được gọi, đã đưa ra ngoại lệ:
try { // try code .. m.invoke(testObject); .. } catch (InvocationTargetException e) { // Answer: e.getCause().printStackTrace(); } catch (Exception e) { // generic exception handling e.printStackTrace(); }Đó là InvocationTargetException có lẽ đang gói ArrayIndexOutOfBoundsException của bạn. Không có thông báo trước khi sử dụng sự phản chiếu mà phương thức đó có thể ném - vì vậy thay vì sử dụng phương pháp throws Exception, tất cả các ngoại lệ đều bị bắt và gói gọn trong InvocationTargetException.
Điều này mô tả một cái gì đó như,
InvocationTargetException là một ngoại lệ được kiểm tra bao bọc một ngoại lệ được ném bởi một phương thức hoặc hàm tạo được gọi. Kể từ phiên bản 1.4, ngoại lệ này đã được trang bị thêm để phù hợp với cơ chế xâu chuỗi ngoại lệ cho mục đích chung. "Ngoại lệ đích" được cung cấp tại thời điểm xây dựng và được truy cập thông qua phương thức getTargetException () hiện được gọi là nguyên nhân và có thể được truy cập thông qua phương thức throwable.getCause (), cũng như phương thức "di sản" đã nói ở trên.
Bạn có thể so sánh với Lớp ngoại lệ ban đầu bằng phương thức getCause () như thế này:
try{ ... } catch(Exception e){ if(e.getCause().getClass().equals(AssertionError.class)){ // handle your exception 1 } else { // handle the rest of the world exception } }Tôi đã gặp lỗi Java.lang.reflect.InvocationTargetException từ một câu lệnh gọi một đối tượng logger trong một class bên ngoài trong một khối try/catch trong class của tôi.
Bước qua mã trong trình gỡ lỗi Eclipse và di chuột qua câu lệnh logger tôi thấy logger object là null (một số hằng số bên ngoài cần được khởi tạo ở đầu class của tôi).
Ngoại lệ này được ném nếu phương thức cơ bản (phương thức được gọi là sử dụng Reflection) ném ngoại lệ.
Vì vậy, nếu phương thức, được gọi bởi API phản chiếu, sẽ đưa ra một ngoại lệ (ví dụ như ngoại lệ thời gian chạy), API phản chiếu sẽ bao bọc ngoại lệ thành InvocationTargetException.
Tôi đã phải đối mặt với cùng một vấn đề. Tôi đã sử dụng e.getCause (). GetCause () sau đó tôi thấy rằng đó là do tham số sai mà tôi đã truyền. Có nullPulumException trong việc tìm nạp giá trị của một trong các tham số. Hy vọng điều này sẽ giúp bạn.