收集Java方法中的错误,清空ArrayList与LinkedList

时间:2013-03-04 16:28:03

标签: java list error-handling

我似乎偶尔会创建这两种方法:

// return null on errors, and append errors to 2nd param, otherwise return result
String fetchSomething(String parameter, List<String> errorMessagesOut);

// return empty list or null on no errors, otherwise list of errors
List<String> verifySomething(String parameter);

然后调用它们的代码将使用适当的分隔符(例如简单的逗号,换行符,HTML标记......)加入错误列表,通常使用Apache Commons Stringutils.join方法。在正常情况下,没有错误,列表将为空。

所以,我开始怀疑这两个问题:

  1. 您是否看到将错误消息字符串作为列表返回时出现问题?如果是这样,有什么更好的选择? (不是例外,当需要时,调用这些方法的代码会引发这种情况。)

  2. 对于预期保持为空的列表,new LinkedList()new ArrayList(0)new ArrayList()更好,并且通常只有顺序迭代器访问权限什么时候不是空的?


  3. 编辑:示例用例:

    List<String> verifyParameters(JSONObject params) {
        List<String> ret = new ArrayList<String>(0);
    
        if (!verifyKey(params.get("key"))) 
            ret.add("Invalid key: " + key);
    
        if (!verifyAccess(params.get("user"), params.get("pass"))) 
            ret.add("Authentication error");
    
       return ret;
    }
    

    ...

    List<String> errors = verifyParameters(params);
    if (!errors.isEmpty()) {
    
        connection.sendErrorListMessage(errors);
        logger.warn(StringUtils.join(errors, ", "));
        controlPanel.show("Errors: \n- " + StringUtils.join(errors, "\n- ") + '\n');
        throw new AbortException("invalid params); // or maybe return false/null;
    }
    // proceed with valid params
    

    通常错误列表的处理不会包含所有这些,它只是试图说明错误列表是一个供人类查看的消息列表,与其显示方式无关,也与/无关。对于以不同方式处理不同的错误非常有用。

4 个答案:

答案 0 :(得分:3)

我认为使用字符串列表很好。我倾向于至少为Result创建一个专门的fetchSomthing类,并且这样做,特别是如果传递的errorMessagesOut除了新的空列表之外什么都不是:

Result result = fetchSomething(String parameter);
if (result.hasErrors()) {
    List<String> errors = result.getErrors();
} else {
    String fetched = result.getValue();
}

然后我还会把处理错误字符串的任何方法放在这个类上,这样你就可以做类似的事情:

String errorMessage = result.getErrorString();

这将错误数据及其格式封装在一个Class中,这意味着在没有错误的情况下,您不需要在Result实例内部创建任何List。

我的上述观点主要是代码设计。没有分析并且没有基准来与任何变化的结果进行比较,尝试微优化没有意义。

答案 1 :(得分:1)

这些错误是什么?您是否要根据方法返回的错误做出一些商业决策?否则,如果错误仅用于记录,则简单的记录解决方案将建议在错误发生时立即记录错误。我在谈论那些logger.debug("Error message");

无论如何,您能否举例说明退回后对此错误采取的措施?

但有一点我指出:如果您使用相同的数组/列表/集合来处理结果和错误,那么它往往会让您感到困惑。如果您的方法返回错误列表(或者在没有错误的情况下为空/空列表),这也会让您感到困惑,因为看起来错误是执行方法的结果。

答案 2 :(得分:1)

尝试使用列表收集所有错误信息没有错。 使用ArrayList可以正常工作,无需担心......

如果您知道没有错误,可以return Collections.emptyList();

通常,集合避免同时返回null或空列表。我总是使用空列表,因为不会中断循环。

答案 3 :(得分:1)

  

您是否看到将错误消息字符串作为列表返回时出现问题?如果   那么,有什么更好的选择呢?

没有。如果列表解决了你的问题,那么使用列表没有任何问题。

  

new LinkedList()new ArrayList(0)new ArrayList()更适合   列表预计将保持空白,通常应该具有   只有顺序迭代器访问时它不是空的?

了解列表将存储多少元素并使用该容量实例化列表将不会对性能有任何显着改进:

  

每个ArrayList实例都有一个容量。容量是大小   用于存储列表中元素的数组。它总是在   至少与列表大小一样大。随着元素被添加到   ArrayList,其容量自动增长。增长的细节   除了添加元素之外,没有指定策略   持续摊销的时间成本。

如果列表通常为空,那么您将使用new ArrayList(0)保存一些内存,因为当没有指定初始容量时,列表的大小初始化为10