java中的Arrays.copyOfRange方法抛出不正确的异常

时间:2015-12-29 09:13:42

标签: java arrays exception exception-handling try-catch

我今天正在处理数组,突然间我遇到了一个意外异常的情况。

如果您查看下面的代码,我认为它必须抛出public class CamelExampleTest extends CamelTestSupport { @Override protected RouteBuilder createRouteBuilder() throws Exception { return new RouteBuilder() { @Override public void configure() throws Exception { from("direct:startpoint").id("route1") // .to("exec:wc?args=--words /usr/share/dict/words")// .convertBodyTo(String.class) // .process(new Processor() { @Override public void process(Exchange exchng) throws Exception { String body = exchng.getIn().getBody(String.class); System.out.println(body); } }).to("mock:endpoint"); } }; } @Test public void test() throws InterruptedException { System.out.println("running test"); MockEndpoint resultEndpoint = context.getEndpoint("mock:endpoint", MockEndpoint.class); } } ,但令人惊讶的是它会抛出ArrayIndexOutOfBoundsException

IllegalArgumentException

如果我弄错了,有人可以帮助我,让我知道吗?

4 个答案:

答案 0 :(得分:21)

嗯,Javadoc说:

  

<强>抛出:

     
      
  • ArrayIndexOutOfBoundsException - 如果来自&lt; 0或来自&gt; original.length

  •   
  • IllegalArgumentException - 如果来自&gt;至

  •   

查看实施情况,由于IllegalArgumentException溢出,您可以看到ArrayIndexOutOfBoundsException例外而不是int

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&gt; to因为to-from导致int溢出(由于fromInteger.MIN_VALUE),导致结果为newLength

答案 1 :(得分:3)

您从范围发送Integer.MIN_VALUE(-2147483648)。 你可能打算发送0而不是

答案 2 :(得分:2)

您将面临错误,因为MIN_VALUE = -2147483648 [0x80000000]为负数。或者你设置0即Arrays.copyOfRange(a, 0, 10);。它会让你复制。

答案 3 :(得分:1)

java Docs与实现之间存在未匹配

正如Eran所说,我们可以看到由于int溢出,我们得到了一个IllegalArgumentException异常而不是ArrayIndexOutOfBoundsException。