18

我正在尝试检查数组位置是否超出范围,最简单的方法是什么?

int[] arr;
populate(arr);
if(arr[-1] == null)
//out of bounds!

像这样的东西会起作用吗?

我很确定这可以通过 trycatch 或扫描仪来完成,但对于一个简单的小程序,还有其他方法吗?

4

3 回答 3

43

绝对不要为此使用 try-catch。只需使用:

boolean inBounds = (index >= 0) && (index < array.length);

使用 try-catch 实现该方法将需要捕获一个ArrayIndexOutOfBoundsException,这是一个未经检查的异常(即 的子类RuntimeException)。永远不应(或至少非常罕见)捕获和处理此类异常。相反,应该首先防止它们。

换句话说,未经检查的异常是您的程序不希望从中恢复的异常。现在,到处都有例外(没有双关语)。例如,通过调用字符串Integer.parseInt()并捕获潜在NumberFormatException(未检查)来检查字符串是否可比喻为整数已成为一种常见的做法。这被认为是好的,但在做类似的事情之前总是三思而后行。

于 2013-10-30T01:37:19.937 回答
3

最好手动检查索引是否在范围内。

if(index >=0 && index < array.length){
   // in range
}  

未经检查的异常,即不需要 try-catch 块的异常,不应被捕获。ArrayIndexOutOfBoundsException是其中之一。

所有未经检查的异常都来自RuntimeException类。
来自这个类的IndexOutOfBoundsException
This被进一步专门化为StringIndexOutOfBoundsArrayIndexOutOfBounds

RuntimeException 是可以在 Java 虚拟机正常运行期间抛出的那些异常的超类。

RuntimeException 及其子类是未经检查的异常。如果未经检查的异常可以通过方法或构造函数的执行抛出并传播到方法或构造函数边界之外,则不需要在方法或构造函数的 throws 子句中声明它们。

于 2013-10-30T01:41:57.803 回答
3

不,这会导致异常。

相反,做

if (x < 0 || x >= arr.length) {
    //x is out of bounds!
}
于 2013-10-30T01:37:40.040 回答