2012-07-12 49 views
16

Tôi muốn gọi một phương thức, sử dụng Java Reflection.Làm thế nào để gọi một phương thức mà ném một ngoại lệ bằng cách sử dụng Java Reflection?

Vấn đề là phương pháp này (mà tôi đã viết) ném một ngoại lệ (tôi đã tạo một myCustomException). Khi tôi thêm một mệnh đề try/catch, tôi không thể chạy dự án của mình, bởi vì Eclipse nói "mệnh đề catch là không thể truy cập".

Đây là khi tôi cố gắng gọi myMethod trong lớp MyClass:

270. myMethod.invoke(null, myParam); // NB : null because myMethod is static 

Khi MyMethod không ném một MyCustomException, eveything là tốt. Nhưng khi nó ném một MyCustomException, tôi nhận được thông báo lỗi này:

Hãy nói rằng tôi cố gắng gọi fooMethod(), đó là trong lớp BarClass(), và:

java.lang.reflect.InvocationTargetException 
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) 
    at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source) 
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source) 
    at java.lang.reflect.Method.invoke(Unknown Source) 
    at com.tests.MyClass.test5(270) 
    at com.tests.MyClass.main(297) 
Caused by: com.tests.MyCustomException 
    at com.tests.barClass.fooMethod(BarClass.java:129) 
    ... 6 more 

Thậm chí có thể không? Cảm ơn bạn đã giúp đỡ.

+0

Dường như các phương pháp gọi là ném một ngoại lệ. Quanh nó với thử-catch. – Razvan

Trả lời

23

Bạn có thể nhận được nguyên nhân của nó sẽ là ngoại lệ ban đầu.

InvocationTargetException.getCause(); 

Từ tài liệu:

InvocationTargetException là một ngoại lệ kiểm tra rằng kết thúc tốt đẹp một ném ngoại lệ bởi một phương pháp gọi hoặc constructor.

http://docs.oracle.com/javase/6/docs/api/java/lang/reflect/InvocationTargetException.html

Trong khối catch của bạn, bạn có thể kiểm tra nếu hợp ngoại lệ là từ loại bạn mong đợi và xử lý nó.

Một phương pháp đơn giản sẽ là:

try { 
    ... 
} catch (InvocationTargetException ite) { 
    if (ite.getCause() instanceof SomeExceptionType) { 
     ... 
    } else { 
     ... 
    } 
} 
+0

Cảm ơn! Nó hoạt động. Nhưng tôi không thể nhận được thông báo từ MyCustomException của tôi, với 'getCause(). GetMessage()', ngay cả khi tôi đã tạo MyCustomException như thế này: 'new MyCustomException (" message ")'. – cleroo

+0

Tôi nghĩ rằng điều này có thể do triển khai cụ thể của bạn, bạn có thể gỡ lỗi và kiểm tra xem ngoại lệ có thực sự giữ thông báo không? –

+0

Tôi đã thành công với cách thức của Marko Topolnik. Cảm ơn bạn anyway. – cleroo

1

Nếu bạn đang cố gắng để thêm một điều khoản catch trong phương pháp thực thi myMethod.invoke(null, myParam), thì đó là rõ ràng không phải là cách đúng đắn để làm việc đó. Trong trường hợp này, bạn đang gọi phương thức thông qua sự phản chiếu và đây không phải là nơi để bắt ngoại lệ, vì phương thức invoke ném các ngoại lệ khác. Một khi bạn gọi phương thức mà ném ngoại lệ, nếu có một ngoại lệ, nó sẽ bị ném và bọc trong một InvocationTargetException, nếu tôi nhớ chính xác.

Kiểm tra phần cuối cùng của this explanation liên quan đến InvocationTargetException.

9

Một cách để làm điều đó:

try { myMethod.invoke(null, myParam); } 
catch (InvocationTargetException e) { 
    try { throw e.getCause(); } 
    catch (MyCustomException e) { ...} 
    catch (MyOtherException e) { ...} 
} 
+0

+1 cách tiếp cận tốt đẹp;) –

+0

Thực ra nó không hoạt động::/ – cleroo

+0

Nó hoạt động. Đó là lỗi của tôi, trong MyCustomException của tôi, các nhà xây dựng đã không được thiết lập một cách chính xác: Tôi đã không vượt qua thông điệp! Lỗi ngu ngốc – cleroo

Các vấn đề liên quan