返回异常的优先级是什么?

时间:2014-01-13 03:36:12

标签: java exception

考虑一下这个仅用于提问我的自定义代码

此方法只是名为CompleteGraph的类中的众多方法之一。细节不是必需的。 GetEdges进行2次检查 - 一次验证是否构造了完整图,如果是,则检查输入是否为空。

但我也可以交换检查并检查nodeId==null之前,这意味着即使两个条件都抛出异常,但用户收到的异常顺序也不同。

我的问题是 - 为了获得更好的用户体验,是否有一些关于返回异常的指令/链接?

public Map<T, Double> getEdges(T nodeId) {
        if (isGraphComplete()) throw new IllegalStateException("The graph is not complete graph.");
        if (nodeId == null) throw new NullPointerException("The nodeId input is null");
        Map<T, Double> map = heuristic.get(nodeId);
        return map == null ? map :  Collections.EMPTY_MAP;
    }

2 个答案:

答案 0 :(得分:3)

要直接回答您的问题,我认为没有针对哪个命令抛出验证异常(或任何例外情况)的一般指导原则。我也不同意Elliott关于这个问题的另一个答案,你不应该抛出未经检查的例外。

由于你的问题有点主观,这是我更主观的答案。我认为这取决于您认为为呼叫者提供更好的“用户体验”。如果你打电话给这个方法,你会发生什么?然后只要记录给调用者,就没关系。

如果您不知道您的呼叫者是谁(即您的班级是在图书馆中)并且不知道他们的用例,则很难知道呼叫者将如何处理异常。您无法根据自己的意愿做出明智的决定。

现在特别关注你的代码,我通常会选择“如果你知道你将会失败,快速失败”的理念。如果你的isGraphComplete方法更贵,并且你知道你的方法可能会因为参数为null而稍后失败,我会先进行廉价的空检查。

答案 1 :(得分:2)

用户不使用开发人员API。开发人员为他们设计!也就是说,通常我不会抛出未经检查的异常(但我会专注于记录我抛出的所有异常,我甚至可以定义我自己检查的异常 - 然后记录的内容更少)!