【问题标题】:EAFP. Ask for forgiveness not permission in JavaEAFP。在 Java 中请求宽恕而不是许可
【发布时间】:2014-11-30 09:15:44
【问题描述】:

在一般情况下和下一个示例中请求宽恕而不是许可是 Java 的一种好习惯吗?

例子是:

try {
    Cell value = array2D[rowIndex][columnIndex];
}
catch (ArrayIndexOutOfBoundsException e) {}

正如您在上面的代码中看到的,我们从array2D 中得到value。如果value 超出范围,我们什么也不做。

我问这个问题是因为在某些情况下(例如在array2D 中查找给定Cell 的所有邻居),实现EAFP 比实现LBYL(在你跳跃之前查看)要容易得多。

【问题讨论】:

  • 我猜你来自 python 背景。我只是 java 的新手,但我发现 java 中存在的作用域在某种程度上阻碍了您充分利用 EAFP 的能力。请参阅上面的示例中的Cell 超出范围,然后才能使用它。

标签: java exception try-catch


【解决方案1】:

您可以通过检查数组的大小来避免引发异常的开销:

if(rowIndex < array2D.length)
{
    if(columnIndex < array2D[rowIndex].length)
    {
        // you are safe here
    }
}

【讨论】:

    【解决方案2】:

    不,这不是一个好主意,有几个原因:

    • if 的运行时性能比try...catch 要好得多
    • 结合大量不必要的catches 代码可读性较差

    【讨论】:

    • 有没有什么情况下我们更喜欢在 Java 中使用 EAFP?或者例外仅适用于@Elliott所说的例外情况。
    • 这实际上回答了这个问题。谢谢
    【解决方案3】:

    我个人认为使用 try catch 而不是获取数组长度是一种糟糕的做法; Exception(s) 用于特殊情况,数组的长度是一个字段

    if (rowIndex < array2D.length && columnIndex < array2D[rowIndex].length) {
      Cell value = array2D[rowIndex][columnIndex];
      // ...
    } else {
      break;
    }
    

    【讨论】:

      猜你喜欢
      • 2012-08-29
      • 1970-01-01
      • 2013-06-11
      • 1970-01-01
      • 2018-07-27
      • 2010-09-29
      • 1970-01-01
      • 2018-11-05
      相关资源
      最近更新 更多