2013-05-18 47 views
6

Tạo mã bên dưới trong khi chơi với các vòng lặp. Mã dưới đây lưu trữ các giá trị Fibonacci vào một mảng và sau đó in chúng bằng cách sử dụng cho các vòng lặp.Tăng cường đối với ngoại lệ vòng lặp

int [] numbers; 
    numbers = new int[25]; 

    numbers[0] = 1; 
    numbers[1] = 1; 
    System.out.println("Initializing the array values"); 

    for(int i = 2; i < numbers.length; i++) 
    { 
     numbers[i] = numbers[i-1] + numbers[i-2]; 
    } 

    System.out.println("Printing out Fibonacci values"); 

    for(int i = 0; i < numbers.length; i++) 
    { 
     System.out.print(numbers[i] + ", "); 
    } 

Mã trên hoạt động tốt. Lần đầu tiên tôi ném nó với nhau mặc dù, tôi sử dụng một vòng lặp tăng cường để in ra các giá trị (thứ hai cho vòng lặp trong mã). Điều này biên dịch tốt, nhưng khi tôi chạy nó tôi nhận được sau đây;

Initializing the array values 
Printing out Fibonacci values 
1, 1, 2, 3, 8, 34, 377, 17711, Exception in thread "main" java.lang.ArrayIndexOutOfBoundsException: 34 
at ArrayDemo.main(ArrayDemo.java:21) 

Tôi không hiểu sai. Thay đổi vòng lặp thứ hai không nên thay đổi các giá trị (bạn sẽ nhận thấy các giá trị fibonacci là sai (tức là các giá trị bị thiếu)). Và tôi không hiểu tại sao một vòng lặp tăng cường đơn giản sẽ bỏ qua các chỉ mục. Bây giờ, điều này không thực sự là một vấn đề lớn bởi vì đây không phải là một dự án hay bất cứ thứ gì, nó chỉ gây lỗi cho tôi mà tôi không thể hiểu tại sao nó lại làm việc đó. Bất kì manh mối nào?

Tăng cường cho vòng lặp trông giống như thế này;

for(int i : numbers) 
    { 
     System.out.print(numbers[i] + ", "); 
    } 

Trả lời

5
for(int i : numbers) 
{ 
    System.out.print(numbers[i] + ", "); 
} 

i đây là yếu tố trong mảng, không phải là chỉ số. Nó có thể lớn hơn numbers.length.

Ví dụ, nếu numbers = {1,2,3,9} sau đó i sẽ 1, 2, 3, 9. Nhưng chiều dài của nó là 4, vì vậy khi bạn lặp lại các phần tử bên trong nó, bạn đang cố gắng làm numbers[9] vượt quá kích thước của nó.

Bạn có thể muốn System.out.print(i + ", ");

+1

Cảm ơn bạn. Ngắn gọn và dễ hiểu. –

5

for(int i = 0; i <= numbers.length; i++) nên

for(int i = 0; i < numbers.length; i++)

Trong java, mảng là 0 dựa lập chỉ mục. Nó có nghĩa là yếu tố đầu tiên bạn nên được truy cập tại chỉ số 0 và rõ ràng là người cuối cùng ở độ dài của mảng của bạn trừ đi 1.

int tab[] = new int[3]; //tab of length 3 
tab[0] = 11; 
tab[1] = 24; 
tab[2] = 5; 

Ở đây bạn truy cập vào các yếu tố cuối cùng bằng cách gọi tab[2] hoặc tab[tab.length-1], đó là tương đương.


Xin lỗi, đó chỉ là một sai lầm trong đoạn code tôi đưa ra trong câu hỏi .

Vấn đề là bạn nên làm: System.out.print(i + ", "); Bạn nên đọc thisthis về tăng cường cho vòng lặp.

Các cho tuyên bố cũng có một hình thức thiết kế cho lặp qua Bộ sưu tập và mảng hình thức này đôi khi được gọi là tăng cường cho tuyên bố, và có thể được sử dụng để làm các vòng của bạn nhiều hơn nhỏ gọn và dễ đọc. Để chứng minh, xem xét các mảng sau, nắm giữ các con số từ 1 đến 10:

int[] numbers = {1,2,3,4,5,6,7,8,9,10}; 

Các chương trình sau đây, EnhancedForDemo, sử dụng tăng cường cho để lặp qua mảng:

class EnhancedForDemo { 
    public static void main(String[] args){ 
     int[] numbers = 
      {1,2,3,4,5,6,7,8,9,10}; 
     for (int item : numbers) { 
      System.out.println("Count is: " + item); 
     } 
    } 
} 

Trong ví dụ này, mục biến giữ giá trị hiện tại từ mảng số.

Vì vậy, item giữ giá trị hiện tại từ mảng số và không chỉ mục hiện tại. Đó là lý do tại sao bạn nhận được IOOBE.

+3

Giải thích nhanh về lập chỉ mục dựa trên 0 sẽ làm cho câu trả lời này trở thành một câu trả lời tuyệt vời! – christopher

+0

Xin lỗi, đó chỉ là một sai lầm trong mã tôi đưa lên trong câu hỏi. Điều đó đã được thực hiện ngay lần đầu tiên. Nó vẫn không giải thích lý do tại sao tăng cường cho vòng lặp không hoạt động. Tôi đã chỉnh sửa mã câu hỏi để phản ánh điều này. –

2
for(int i : numbers) 
{ 
    System.out.print(numbers[i] + ", "); 
} 

nên

for(int i : numbers) 
    { 
     System.out.print(i + ", "); 
    } 

Bạn không cần phải sử dụng các chỉ số trong tăng cường vòng lặp for.

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