一种干净的方式,如果声明结构'避免java.lang.ArrayIndexOutOfBoundsException:-1

时间:2016-04-17 16:42:43

标签: java algorithm

我有以下代码:

dist[i - 1][j] = i - 1 >= 0 ? findDist(matrix, i - 1, j, rowNum, colNum, dist) : 0;

我得到了java.lang.ArrayIndexOutOfBoundsException: -1

所以我必须将代码更改为:

if (i - 1 >= 0) {
        dist[i - 1][j] =  findDist(matrix, i - 1, j, rowNum, colNum, dist);
}

然而,它变得越来越清洁。我想知道是否有更好的方法来构造上面的代码?谢谢!

2 个答案:

答案 0 :(得分:0)

在这种特定情况下,您无法避免分支,因为您正在进行分配,而IOOBE来自分配的左侧(例如,目标)。你无法在右边做什么 - 任务的手边会阻止评估左侧并最终访问越界索引。您需要为其分配,或跳过分配给它。这是分支。

有些语言可以以不同的方式完成分支,但在Java中,您的if就是这样做的。

您可以在接受lambda的实用程序函数中隐藏分支,但对于给定的示例,这可能是过度的。

答案 1 :(得分:0)

你在dist [i-1]中得到了ArrayIndexOutOfBoundException。因为i-1可以等于-1。因此,在访问dist数组元素之前,最好先检查该值是否大于或等于0。