2015-04-11 18 views
6

Giả sử chúng ta một lớp có tên là DynamicClass:Làm thế nào để bắt ngoại lệ MethodNotFoundException bên trong lớp học?

public class DynamicClass { 

    public void get(String input) { 
     System.out.println(input); 
    } 

} 

Bây giờ, hãy tưởng tượng tạo đối tượng sau đây DynamicClass:

DynamicClass clazz = new DynamicClass(); 
clazz.getName(); 
clazz.getOther(); 

Tất nhiên, sự kêu gọi của getNamegetOther phương pháp ném MethodNotFoundException ngoại lệ. Tuy nhiên, tôi tò mò, có cách nào để nắm bắt ngoại lệ MethodNotFoundException bên trong lớp DynamicClass, tức là gọi số get("Name")get("Other") thay vì ném ngoại lệ MethodNotFoundException do gọi số getName()getOther()?

+1

Điều đó sẽ không xảy ra trong Java. Nhưng tôi nghĩ rằng việc định nghĩa một phương thức "mặc định" như vậy có thể có trong một ngôn ngữ động như Groovy: http://rosettacode.org/wiki/Respond_to_an_unknown_method_call#Groovy –

+1

Đây không phải là một thời gian biên dịch, lỗi, thay vì là một ngoại lệ thời gian chạy . Gọi một số phương pháp không có ở đó ... !!!! Ahha, tôi không biết về Reflections như @MarounMaroun: (Vui lòng biết, tôi có thể đọc một cái gì đó mới :-) –

+2

@nIcEcOw Sử dụng sự phản chiếu nó sẽ không là một lỗi. Mọi thứ đều năng động ở đó. – Maroun

Trả lời

0

Với tham chiếu đến this answer, nó có thể bắt tất cả các trường hợp ngoại lệ còn tự do trong Java:

Thread.setDefaultUncaughtExceptionHandler(new Thread.UncaughtExceptionHandler() { 
    @Override 
    public void uncaughtException(Thread thread, Throwable throwable) { 
     // TODO 
    } 
}); 
0

Tại sao không?

try{ 
    clazz.getName(); 
    clazz.getOther(); 
}catch(MethodNotFoundException e){ 
    clazz.get("Name") 
} 

Nhưng thực sự không nghĩ rằng đó là ý tưởng tốt ...

+0

Đây không phải là những gì OP đang tìm kiếm, anh ấy đang nói đến sự phản chiếu, lớp học là năng động. Mã của họ chỉ để minh họa vấn đề. – Maroun

+0

@MarounMaroun OP không nói gì về việc sử dụng sự phản chiếu. – EJP

2

đẹp tò mò.

Tôi sợ, không có cách nào khác ngoài việc sử dụng try catch trong Java, nhưng nếu Java là trình biên dịch OTF (trên bay) và cơ chế ngoại lệ thực sự sử dụng phương thức (if-responds_to?) khai báo trên đỉnh của kim tự tháp phân cấp của kế thừa Class cho ví dụ Object trong Java mà có thể ghi đè lên phương thức đó trên DynamicClass của bạn.

Tuy nhiên Java không sử dụng cơ chế trên để kiểm soát if responds_to? và các tin nhắn được gửi đến một đối tượng (lớp) được kiểm tra ở đâu đó trong trình biên dịch nhưng không phải là một phương thức mà bạn có thể ghi đè lên.

Tôi biết một ngôn ngữ được gọi là (Magik) có cơ chế ở trên rất đẹp và đó là trình biên dịch OTF.

Lớp đối tượng trong Magik có một phương thức có tên does_not_responds_to() và bất cứ khi nào thư được gửi tới đối tượng, nó được kiểm tra với trạng thái và hành vi của lớp và cuối cùng tăng hoặc tốt hơn để nói phương thức does_not_responds_to() trong trường hợp tên phương thức (tin nhắn) không hợp lệ.

Đây là giải pháp rất gọn gàng để triển khai thực hiện lệnh does_not_responds_to? trong lớp (DynamicClass) để xử lý ngoại lệ trước khi nó tăng lên. tuy nhiên sau 10 năm trải nghiệm với Magik, không bao giờ cần phải làm như vậy.

Xin lỗi, tiếng Anh của tôi không tốt, tôi hy vọng tôi có thể giải thích vấn đề.

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