抛出异常以指示未找到元素

时间:2014-11-06 10:54:05

标签: java design-patterns

在下面的代码中,如果在String列表中找不到元素,我会抛出异常。

import java.util.ArrayList;
import java.util.List;

public class TestException {

    private static List<String> strList = new ArrayList<String>();

    static {
        strList.add("1");
        strList.add("2");
    }
    public static void main(String argsp[]) {

        try {
            String res = new TestException().findId("1");
            System.out.println(res);
        } catch (Exception e) {
            e.printStackTrace();
        }

        try {
            String res = new TestException().findId("11");
            System.out.println(res);
        } catch (Exception e) {
            e.printStackTrace();
        }

    }

    private String findId(String id) throws Exception {

        for(String str : strList){
            if(id.equalsIgnoreCase(str)){
                return str;
            }
        }

        throw new Exception("Exception Thrown - element not found");

    }

}

当运行输出为:

1
java.lang.Exception: Exception Thrown - element not found
    at com.fmr.fc.portlet.actionabledashboard.throttling.TestException.findId(TestException.java:40)
    at com.fmr.fc.portlet.actionabledashboard.throttling.TestException.main(TestException.java:24)

为了保持代码量低的问题我正在抛出异常,但我会抛出一个自定义异常。 我抛出异常的原因是自定义异常被进一步调用堆栈以指示错误。

但以这种方式抛出异常是不好的做法 - 如果找不到id,findId会抛出异常吗?

2 个答案:

答案 0 :(得分:1)

是的,这是不好的做法。您应该编写一个传递布尔值的函数,并允许程序使用它来确定要执行的操作。

例外应该仅用于处理非常罕见的,完全不可避免的事件。它们不应该是代码标准逻辑的一部分,它们(惊喜!)是规则的例外。可能(可能)发生的事情,但是非常不可能,你真的,真的找不到阻止它们的方法。

答案 1 :(得分:0)

一般来说,在这种情况下抛出异常是不好的做法。尝试修改函数以返回guava模式中使用的Optional。一些细节here