EAFP。在Java中请求宽恕,而不是事先获得许可。

3

在Java中,通常情况下询问原谅而不是请求许可是一种良好的实践方式。在下面这个例子中也是如此:

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

如上方代码所示,我们从array2D中获取value。如果value超出范围,我们不会做任何操作。
我提出这个问题是因为在某些情况下(例如查找array2D中给定Cell的所有邻居),实现EAFP比实现LBYL(先看后跳)要容易得多。

我猜你来自Python的背景。虽然我还是Java的新手,但我发现Java中作用域的存在有些限制了你充分利用EAFP的能力。就像你上面的例子中,“Cell”在被使用之前已经超出了作用域。 - Paul Rooney
这个回答解决了你的问题吗?Java中的LBYL和EAFP有什么区别? - undefined
3个回答

4

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

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

4

不,这个想法不太好,有几个原因:

  • if 的运行性能比 try...catch 好得多。
  • 当组合许多不必要的 catch 时,代码变得不易读。

有没有一些情况下我们更喜欢在Java中使用EAFP呢?或者像@Elliott所说的,异常只是特殊情况下才会使用。 - zds
这实际上回答了问题。谢谢。 - Paul Rooney

2

我个人认为,在获取数组长度时使用try catch是一种糟糕的做法;Exception应该只用于异常情况,而数组长度则是一个字段。

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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接