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 溢出(由于fromInteger.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内存溢出

如何在 Java 中处理 OutOfMemoryError? [复制]

Java企业微信开发_13_异常:com.qq.weixin.mp.aes.AesException: 解密后得到的buffer非法

数组拷贝,二分法查找

213. House Robber II