NoSuchMethodException的目的是什么,而不是返回null

时间:2017-11-01 16:44:26

标签: java

在Java中,Foo.class.getMethod("bar")声明了NoSuchMethodException类型的已检查异常(等等)。

此例外的目的是什么?我没有返回null足以表明找不到它吗?什么信息或实用程序会引发异常?除了强迫用户明确意识到它无法找到它之外,这似乎是多余的。当某些东西不存在时返回null是Java中的一种常见模式,这似乎是它的主要候选者。那背后的原因是什么呢?

1 个答案:

答案 0 :(得分:1)

似乎Java API的设计者区分了可以提出缺少某些内容的情况以及当您只询问存在的内容时的情况。

他们认为在Map.get中要求丢失密钥是可以的,因为地图的内容是程序在运行时控制的。因此,类库的设计者认为在调用null之前要求程序员检查某个值是否存在是不合理的,并决定返回getMethod

但是,在特定运行期间,类中的方法列表始终保持静态,因此请求程序员仅针对存在的方法调用Method是合理的。这种方法有两个后果:

  • 您可以请求多种方法而无需检查每种方法 - 如果您有必须存在的方法列表,例如,在插件组件中,您可以获取他们的getMethod反射对象不检查单个getMethods()来电的返回值,
  • 当您不知道方法是否存在时,请致电Class - 您仍然可以通过从class Plugin { private final Method init; private final Method start; private final Method stop; public Plugin(Class cl) throws PluginException, SecurityException { try { init = cl.getMethod("init"); start = cl.getMethod("start"); stop = cl.getMethod("stop"); } catch (NoSuchMethodException ex) { throw new PluginException("Plugin is missing a required method", ex); } } ... } 对象获取完整列表来检查所有方法,而无需知道其名称

这是一个代码示例来说明第一点。当前的API允许你写这个:

class Plugin {
    private final Method init;
    private final Method start;
    private final Method stop;
    public Plugin(Class cl) throws PluginException, SecurityException {
        init = cl.getMethod("init");
        if (init == null) {
            throw new PluginException("Plugin is missing init method");
        }
        start = cl.getMethod("start");
        if (start == null) {
            throw new PluginException("Plugin is missing start method");
        }
        stop = cl.getMethod("stop");
        if (stop == null) {
            throw new PluginException("Plugin is missing stop method");
        }
    }
    ...
}

而不是:

{{1}}