2012-10-09 37 views
8

Khi tôi chạy lớp này cho vòng lặp dường như chấm dứt đầucho vòng lặp kết thúc sớm khi so với Integer.MAX_VALUE và sử dụng System.out.println

class Test { 

    public static void main(String[] args) { 
     int result = 0; 
     int end = Integer.MAX_VALUE; 
     int i; 
     for (i = 1; i <= end; i += 2) { 
      System.out.println(i); 
     } 
     System.out.println("End:" + i); 
    } 

} 

Output là:

1 
3 
5 
... 
31173 
31175 
End:31177 

Tại sao nó có kết thúc ở đó không Thật thú vị nếu tôi xóa System.out.println(i) trong vòng lặp for, đầu ra sẽ là End:-2147483647. Rõ ràng giá trị trong iwrapped round.

Java phiên bản tôi đang sử dụng là

Java(TM) SE Runtime Environment (build 1.6.0_16-b01) 
Java HotSpot(TM) 64-Bit Server VM (build 14.2-b01, mixed mode) 
+1

Thử in số nguyên.MAX_VALUE –

+0

Tôi không nhận được kết quả như vậy. Dường như bộ đệm của bạn được lấp đầy hoặc một cái gì đó. –

+2

Mã không bao giờ được in Kết thúc, đó là một lỗi cũng (mặc dù một chút khác nhau), vòng lặp bạn đã viết là vô hạn, tôi sẽ luôn luôn là <= Integer.MAX_VALUE. – user439407

Trả lời

15

nó một lỗi được biết đến trong Java 6. JIT tối ưu hóa vòng lặp không chính xác. Tôi tin rằng các phiên bản Java gần đây không có lỗi này.

http://vanillajava.blogspot.co.uk/2011/05/when-jit-gets-it-wrong.html

Java 6 update 16 chỉ mới hơn hai tuổi. Tôi đề nghị bạn cập nhật lên phiên bản mới nhất Java 6 update 25 nếu bạn không thể nâng cấp lên Java 7.

BTW Java 6 sẽ kết thúc hỗ trợ miễn phí trong một vài tháng (tháng 12 năm 2012)

+0

Tài nguyên tuyệt vời. +1 –

+0

Chúc mừng :) ..... –

+0

Rất thú vị. Tôi vừa đăng bài tìm kiếm tương tự, ngoại trừ tôi không thực sự biết nguyên nhân gốc rễ của hành vi bất thường này. –

1

Bạn có thể làm việc xung quanh lỗi JVM bằng cách sử dụng Integer.MAX_VALUE-1.

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