2015-12-29 22 views
16

Tôi đã làm việc trên mảng ngày hôm nay và đột nhiên tôi bắt gặp một trường hợp ném ngoại lệ không mong muốn.Phương thức Arrays.copyOfRange trong java ném ngoại lệ không chính xác

Nếu bạn nhìn vào đoạn code dưới đây, tôi nghĩ rằng nó phải ném ArrayIndexOutOfBoundsException, nhưng đáng ngạc nhiên nó được ném IllegalArgumentException thay vì:

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] + " "); 
    } 
} 

Ai có thể giúp tôi và cho tôi biết nếu tôi nhầm?

+0

Nhận xét trong phần mã của bạn cho biết 'OutOfMemoryError'. Ý của bạn là 'IllegalArgumentException'? –

Trả lời

18

Vâng, Javadoc nói:

Ném:

  • ArrayIndexOutOfBoundsException - nếu từ < 0 hoặc từ> original.length

  • IllegalArgumentException - nếu từ> đến

Nhìn vào thực hiện, bạn có thể thấy rằng bạn có một ngoại lệ IllegalArgumentException thay vì ArrayIndexOutOfBoundsException do int tràn:

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; 
} 

Mã này nghĩ rằng from>toto-from gây int tràn (do fromInteger.MIN_VALUE), dẫn đến số âm là newLength.

+1

Bạn có quyền như vậy ... có sự bỏ lỡ phù hợp trong tài liệu và mã .... :( –

+0

@ShowStopper Đó là chính xác – Eran

+0

Cảm ơn @Eran bất kỳ đề xuất để xử lý trong mã của tôi, tôi nên bắt nó và ném lại như indexoutofbound .. ..asking bởi vì có vẻ như bạn là cựu chiến binh trong java hơn sau đó 131K danh tiếng .... tuyệt vời SIR :) –

3

Bạn gửi Integer.MIN_VALUE (-2147483648) từ phạm vi. Bạn có thể muốn gửi 0 thay vì

2

Bạn gặp lỗi là MIN_VALUE = -2147483648 [0x80000000] âm. hoặc u đặt 0, ví dụ: Arrays.copyOfRange(a, 0, 10);. nó sẽ cho phép bạn sao chép.

1

Có bỏ lỡ trận đấu giữa Documents java và thực hiện

Như expalained bởi Eran chúng ta có thể thấy rằng chúng tôi đã nhận một ngoại lệ IllegalArgumentException thay vì ArrayIndexOutOfBoundsException do int tràn.

Các vấn đề liên quan