java中的Arrays.copyOfRange方法抛出不正确的异常
Posted
技术标签:
【中文标题】java中的Arrays.copyOfRange方法抛出不正确的异常【英文标题】:Arrays.copyOfRange method in java throws incorrect exception 【发布时间】:2016-04-03 03:41:16 【问题描述】:我今天正在处理数组,突然遇到一个抛出意外异常的场景。
如果你看下面的代码,我认为它必须抛出ArrayIndexOutOfBoundsException
,但令人惊讶的是它却抛出了IllegalArgumentException
:
import java.util.Arrays;
public class RangeTest
public static void main(String[] args)
int[] a = new int[] 0,1,2,3,4,5,6,7,8,9;
int[] b = Arrays.copyOfRange(a, Integer.MIN_VALUE, 10);
// If we'll use Integer.MIN_VALUE+100 instead Integer.MIN_VALUE,
// OutOfMemoryError will be thrown
for (int k = 0; k < b.length; k++)
System.out.print(b[k] + " ");
如果我弄错了,谁能帮助我并告诉我?
【问题讨论】:
代码部分中的注释为OutOfMemoryError
。你的意思是IllegalArgumentException
?
【参考方案1】:
好吧,Javadoc 说:
投掷:
ArrayIndexOutOfBoundsException - 如果来自 original.length
IllegalArgumentException - 如果从 > 到
查看实现,您可以看到由于int
溢出,您得到了IllegalArgumentException
异常而不是ArrayIndexOutOfBoundsException
:
public static int[] copyOfRange(int[] original, int from, int to)
int newLength = to - from;
if (newLength < 0)
throw new IllegalArgumentException(from + " > " + to);
int[] copy = new int[newLength];
System.arraycopy(original, from, copy, 0,
Math.min(original.length - from, newLength));
return copy;
这段代码认为from
> to
因为to-from
导致int 溢出(由于from
是Integer.MIN_VALUE
),这导致了一个负的newLength
。
【讨论】:
感谢@Eran 在我的代码中处理的任何建议,我是否应该抓住它并重新抛出为 indexoutofbound ....询问,因为您似乎是 java 的资深人士,超过 131K 的声誉....真棒 SIR :) @ShowStopper 为什么你会向那个方法传递一个否定的from
?您不应该捕获一开始就可以防止被抛出的异常。【参考方案2】:
您从范围发送 Integer.MIN_VALUE(-2147483648)。 您可能打算改为发送 0
【讨论】:
【参考方案3】:您将面临错误,因为 MIN_VALUE = -2147483648 [0x80000000] 是负数。要么你设置 0 即 Arrays.copyOfRange(a, 0, 10);
。它将允许您复制。
【讨论】:
【参考方案4】:java Docs 和 implementation 之间没有匹配
正如 Eran 所解释的,我们可以看到由于 int 溢出,我们得到了 IllegalArgumentException 异常而不是 ArrayIndexOutOfBoundsException。
【讨论】:
以上是关于java中的Arrays.copyOfRange方法抛出不正确的异常的主要内容,如果未能解决你的问题,请参考以下文章
如何在 Java 中处理 OutOfMemoryError? [复制]
Java企业微信开发_13_异常:com.qq.weixin.mp.aes.AesException: 解密后得到的buffer非法