以if else的方式使用try / catch,但是作为条件有例外吗?

时间:2016-03-05 21:43:33

标签: java exception try-catch

  • 如果我在列表中搜索元素并且找不到它, 我抛出一个NotInListException
  • 否则我想将其添加到另一个列表

我是通过

实现的
try {

    element = actualList.find("foo");
    anotherList.append(element);

}
catch (NotInListException e) {
}

这种用法好吗?或者我应该用这样的smth重构它:

if ((element = actualList.find("foo")) != null) {
    anotherList.append(element);
}

4 个答案:

答案 0 :(得分:2)

如果忽略异常处理程序给出的小的运行时间惩罚,这是一种风格问题。

可以设计类似

的堆栈类型
try{
while(true){
    try{
        stack.pop();
    catch(StackElement e){
        processElement(e);
    }
}
catch(EmptyStackException ese){
    // probably not much to do here. 
}

出于可读性和常识的原因,共识是通常if条件使事情更容易理解。异常机制应该用于特殊情况,而不是用于常规流量控制。

在您的特定查找示例中,您有两种情况,其中没有一种情况与众不同。因此可能不需要例外。

1 - 没有找到该元素。

2 - 找到了元素。

案例2需要特别注意,因为您的find版本也想要返回实际元素。

1 || 2是布尔情况。所以这不应该是一个元素。案例2的find()应该是一个元素。

我总是不喜欢非值的返回null。它会造成难看的代码。回忆一下

void f(BufferedReader br){
    String line;
    while( (line = br.readLine()) != null)

最好是将布尔值与元素分开。

if( list.has(foo) ){
    E element = list.get(foo);
}

答案 1 :(得分:1)

你的第二个例子更清晰,更容易阅读。您没有提供任何详细信息,但我认为在您的搜索中找不到值不应被视为特殊情况。

使用Java 8,您甚至可以考虑返回Optional并添加如下结果:

actualList
    .find("foo")
    .ifPresent(v -> anotherList.add(v));

答案 2 :(得分:0)

我相信你的代码应遵循逻辑主体。如果问题是抛出或不抛出NotInListException,那么要回答的几个问题是:元素不在列表中是一个例外情况吗?我们真的希望该元素在列表中吗?如果答案是肯定的,那么元素不在列表中的情况是例外的,因此抛出异常是有道理的。否则它应该是if-else逻辑。

答案 3 :(得分:-1)

我建议写这样的东西:

List<String> elements; //get the list
try{
    if(elements.contains("foo")){
        anotherList.add("foo");
    }else{
        throw new NotInListException("Element not present");
    }
}catch(NotInListException ex){
    //do something
}