假设我们有一个名为DynamicClass
的类:
public class DynamicClass {
public void get(String input) {
System.out.println(input);
}
}
现在,想象一下DynamicClass
的以下实例化:
DynamicClass clazz = new DynamicClass();
clazz.getName();
clazz.getOther();
当然,调用getName
和getOther
方法会引发MethodNotFoundException
异常。但是,我很好奇,有没有办法在MethodNotFoundException
类中捕获DynamicClass
异常,即调用get("Name")
和get("Other")
而不是抛出{{} 1}}由于调用MethodNotFoundException
和getName()
而导致的异常?
答案 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
}
});