在 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
这进一步专门化为StringIndexOutOfBounds
和ArrayIndexOutOfBounds
RuntimeException 是那些异常的超类,可以 Java虚拟机正常运行时抛出。
RuntimeException 及其子类是未经检查的异常。 未经检查的异常不需要在方法中声明或 构造函数的 throws 子句,如果它们可以通过执行 方法或构造函数并在方法之外传播或 构造函数边界。
【讨论】:
【参考方案3】:不,这会导致异常。
相反,做
if (x < 0 || x >= arr.length)
//x is out of bounds!
【讨论】:
我相信是x >= arr.length
不要忘记条件周围的()
括号。
如果 arr 为空且 x 为零会失败以上是关于在 Java 中检查越界的主要内容,如果未能解决你的问题,请参考以下文章