在 Java 中检查越界

Posted

技术标签:

【中文标题】在 Java 中检查越界【英文标题】:Checking out of bounds in Java 【发布时间】:2013-11-09 10:32:23 【问题描述】:

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

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

这样的东西有用吗?

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

【问题讨论】:

0比较,与arr.length比较 【参考方案1】:

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

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

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

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

【讨论】:

系统是否处于非法状态,结果无法预料?究竟有什么危害? 我相信在大多数情况下,只应在涉及 IO 时捕获未经检查的异常,例如将字符串转换为整数或检查来自硬件设备的空输入(这通常包括工作与 JNI)。否则,您应该避免按照建议捕获未选中的异常。添加评论为建议的内容提供更多背景信息。【参考方案2】:

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

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

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

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

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

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

【讨论】:

【参考方案3】:

不,这会导致异常。

相反,做

if (x < 0 || x >= arr.length) 
    //x is out of bounds!

【讨论】:

我相信是x &gt;= arr.length 不要忘记条件周围的()括号。 如果 arr 为空且 x 为零会失败

以上是关于在 Java 中检查越界的主要内容,如果未能解决你的问题,请参考以下文章

在JAVA中已检查异常和位未检查异常是啥?二者有何区别?

Java 越界错误

数组越界会发生什么

应用层内存溢出/越界/重复释放等问题检查工具

vector

vector