EAFP。请求宽恕而不是Java的许可

时间:2014-11-30 09:15:45

标签: java exception try-catch

在Java中,一般而且在下一个例子中请求宽恕而非许可是一种好习惯吗?

示例是:

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

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

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

3 个答案:

答案 0 :(得分:3)

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

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

答案 1 :(得分:3)

不,由于以下几个原因,这不是一个好主意:

  • if的运行时性能远远优于try ... catch
  • 组合大量不必要的catch es
  • 时,代码的可读性较差

答案 2 :(得分:1)

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

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