2013-04-14 44 views
5

Tôi đã học (ít nhất trong java) rằng giá trị nguyên/dài tràn âm thầm và giá trị của chúng bắt đầu từ giá trị tối thiểu trên tràn thay vì ném bất kỳ ngoại lệ nào.Tại sao dữ liệu số nguyên tràn âm thầm thay vì ném ngoại lệ

Tôi đã sử dụng api bên ngoài cho một số thao tác tệp, trong đó kích thước tệp tối đa đã được tải từ tệp thuộc tính. Tất cả đều ổn trong môi trường thử nghiệm địa phương của tôi. Ngay sau khi mã đã đi vào môi trường sống, giới hạn kích thước tệp tối đa không hoạt động chút nào. Sau hai ngày gỡ lỗi/phân tích mã, không có thành công nào cả. Sau đó, vì một số lý do khác, tôi đã lấy tệp constants.properties trực tiếp và gỡ lỗi mã đó. o_0

Tôi chỉ muốn hỏi, điều gì ngăn họ ném ngoại lệ trên tràn?

+3

Hiệu suất. Kiểm tra tràn sau mỗi hoạt động toán học là tốn kém. Nó sẽ yêu cầu một so sánh và một chi nhánh, cho mỗi bổ sung hoặc nhân. – MTilsted

+0

[Tại sao các ngôn ngữ không nâng cao lỗi trên tràn số nguyên theo mặc định?] (Http://stackoverflow.com/q/103654/995714) –

Trả lời

3

Trong nhiều trường hợp, Java dựa trên C hoặc C++ và chúng dựa trên Assembly. Một tràn/underflow là im lặng trong C và C++ và gần như im lặng trong lắp ráp (trừ khi bạn kiểm tra cờ đặc biệt). Điều này có thể do thực tế là C và C++ không có ngoại lệ khi chúng được đề xuất lần đầu tiên. Nếu bạn muốn xem tràn/underflows bạn chỉ cần sử dụng một loại lớn hơn. ví dụ. long long int hoặc long double;) Hội đồng BTW có thứ gì đó tương tự như các ngoại lệ được gọi là bẫy hoặc ngắt, tràn/tràn không gây ra bẫy AFAIK.

Điều tôi thích làm là sử dụng longdouble trừ khi tôi chắc chắn các loại này lớn hơn nhiều so với mức cần thiết. Bạn không thể có thiết bị tràn qua kích thước long.

+0

'Bạn không thể có thiết bị bị tràn dài kích thước'. Tuyên bố này có giá trị một triệu điểm, một thực tế đơn giản mà lúc đầu bạn không nghĩ đến. Cảm ơn. –

+1

Có thể một ngày sẽ có một trong Java nhưng tập tin sẽ phải trên 9 tỷ GB. –

+1

Có lẽ trong những thời điểm đó, các ngôn ngữ ngày nay sẽ ở I.T. viện bảo tàng. –

1

Lý do là "vì Đặc tả ngôn ngữ Java cho biết".

Section 4.2.2. Integer Operations của JLS nói:

Các nhà khai thác nguyên không chỉ tràn hoặc tràn dưới bất kỳ cách nào.

+1

Huh? Tại sao downvote? Câu trả lời này "không hữu ích"? (Câu trả lời này thực sự chính xác) – Bohemian

+0

+1 thật không may, SO – Ingo

+0

Câu hỏi đặt ra là vì lý do ngôn ngữ được tạo ra theo cách này (do đó từ này là lý do tại sao), chỉ vào đặc điểm kỹ thuật không cung cấp bất kỳ lý luận nào. –

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