如何在类中捕获MethodNotFoundException异常?

时间:2015-04-11 14:30:23

标签: java dynamic reflection

假设我们有一个名为DynamicClass的类:

public class DynamicClass {

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

}

现在,想象一下DynamicClass的以下实例化:

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

当然,调用getNamegetOther方法会引发MethodNotFoundException异常。但是,我很好奇,有没有办法在MethodNotFoundException类中捕获DynamicClass异常,即调用get("Name")get("Other")而不是抛出{{} 1}}由于调用MethodNotFoundExceptiongetName()而导致的异常?

3 个答案:

答案 0 :(得分:2)

好客好奇。

我担心,除了在Java中使用try catch之外别无他法,但如果Java是OTF(即时)编译器,并且异常机制实际上使用了一个预期被声明的(if-responds_to?)方法在类继承的层级金字塔的顶部,例如Java中的Object,可以在DynamicClass上覆盖该方法。

但Java不使用上述机制来控制if responds_to?并且发送到对象(类)的消息在编译器中的其他位置进行测试,但不能作为可以覆盖的方法进行测试。

我知道一种名为(Magik)的语言,它具有上述机制,非常好,它是一个OTF编译器。

Magik中的Object类有一个名为does_not_responds_to()的方法,每当一个消息被发送到一个对象时,它就会针对类状态和行为进行测试,最后提升或者更好地说如果方法是运行do_not_responds_to()方法名称(消息)无效。

实现do_not_responds_to是一个非常巧妙的解决方案吗?类(DynamicClass)中的方法在引发异常之前处理它。然而,经过与Magik的10年经验,从未需要这样做。

抱歉,我的英语不好,我希望我能解释一下这个问题。

答案 1 :(得分:0)

为什么不呢?

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

但实际上并不认为这是个好主意......

答案 2 :(得分:0)

参考this answer,可以捕获Java中所有未被捕获的例外情况:

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