【问题标题】:If-Else statements vs Exception-Catcher?If-Else 语句与异常捕获器?
【发布时间】:2013-05-12 01:16:44
【问题描述】:

我厌倦了在我的代码中添加看似无穷无尽的 if-else 语句,所以我想知道如果我只是在出现问题时捕获异常是否会更好。例如。而不是说:

public static boolean firstStringOfArrayIsTheSameAsTheWord(String word, String[] array) {
    if(word != null) {
        if(array.length > 0) {
            return word.equalsIgnoreCase(array[0]);
        }
    }
    return false;
}

我只要:

public static boolean firstStringOfArrayIsTheSameAsTheWord(String word, String[] array) {
    try {
        return word.equals(array[0]);
    } catch(/*NullPointerException or an ArrayIndexOutOfBoundsException*/ Exception e) {
        return false;
    }
}

请注意,我确实知道我可以在 if 语句中使用多个参数,但我只是对在实践中更好用的方法以及原因感兴趣。

提前致谢!

【问题讨论】:

  • 你很容易开始另一场宗教战争(除了最后一场仍在进行中)。但是另一种“骗子”的处理方法是将所有内容放在do { ... } while(false) 块中,然后使用break 语句离开该块。
  • 使此类方法更具可读性(不那么丑陋)的一种方法是一次执行一个if,如果不满足您的条件,则立即返回。 如果您的方法足够简单,您就不应该遇到 if/else 阶梯看起来“无尽”的情况。
  • @jahroy 这似乎是一个很好的解决方案,非常感谢!我以后会用它。

标签: java exception if-statement try-catch


【解决方案1】:

不,这不是一个好主意,这是对异常处理的滥用。

您应该避免不必要的异常捕获,异常应该只用于出错的事情,因为它们超出了您的控制范围,而不是正常程序流程的一部分。此外,正如@SJuan76 所说,您将隐藏存在真正异常的情况。

如果您厌倦了使用if-else 语句,您可以尝试使用switch(在Java 7 中甚至可以使用work for strings)或在您的应用程序中改进polymorphism

【讨论】:

  • 听起来很粗糙,但是好的,我会去的。谢谢。
【解决方案2】:

一般规则是,“对异常事件使用异常,从不用于控制流”。

所以请使用if(...) else ...

【讨论】:

    【解决方案3】:

    首先,IIRC 正确的异常处理速度很慢。不是很慢,但没有你想在主流逻辑中使用的东西。

    其次,通过这种方式,您将隐藏存在真正异常的情况。您的用户将尝试加载文件,但只会发现文件未加载,如果找不到文件,数据已损坏,无论如何都不会知道。你会丢失很多信息。

    如果你想让你的代码更简单,最好做类似的事情

    /**
     * ....
     * @param word String must not be null.
     * @param array String[] must not be null, have length at least 1, an array[0] must not be null
     */
    public static boolean firstStringOfArrayIsTheSameAsTheWord(String word, String[] array) {
      return word.equals(array[0]);
    }
    

    至少您将清理参数的责任委托给使用您的方法的代码。这不是一件明智的事情(它违背了防御性编程),您的同事会讨厌使用您的代码,但比您的第一种方法更好。

    【讨论】:

    • 所以除了它很慢之外,捕获多个异常可能也不是一个好主意,以防万一发生了其他事情,例如。 } catch(NullPointerException e) { } catch(ArrayIndexOutOfBoundsException e) { } catch(Exception e) { //好吧,现在出了点问题},对吧?
    • 你可以这样做,它会是“正确的”,但不会为你节省任何打字时间,速度会更慢,而且你的代码会更难阅读。
    【解决方案4】:
    do {
        if (conditionA) {
            something;
        }
        else {
            break;
        }
        if (conditionB) {
            somethingElse;
        }
        else {
            break;
        }
        ...
    } while(false);
    

    【讨论】:

    • 哦,哇,我从没想过这些说法。那么你的意见是什么? do-while 循环是否使 if 语句更快,还是违背了每个程序员的信仰? :D
    • 它可能相当便宜,一个好的优化器不会被它扼杀。由于它基本上使用 GOTO(众所周知,它是 considered harmful),因此对初学者感到困惑,并且存在一些陷阱。
    【解决方案5】:

    异常方法不是一个好主意。 抛出异常 1.速度很慢 2. 使您的应用程序不可读。 正如@greedybuddha 所说“对异常事件使用异常,从不用于控制流”。

    【讨论】:

      猜你喜欢
      • 2022-07-22
      • 1970-01-01
      • 1970-01-01
      • 2017-08-29
      • 1970-01-01
      • 2019-04-09
      • 2013-09-01
      • 1970-01-01
      • 2019-08-08
      相关资源
      最近更新 更多