2013-04-14 13 views
5

Nauczyłem się (co najmniej w języku Java), że wartości całkowite/długie przepełniają się w trybie cichym, a ich wartości zaczynają się od wartości minimalnej na przepełnieniu, a nie rzucają żadnego wyjątku.Dlaczego liczba całkowita typów danych przepełnia się po cichu, a nie wyrzuca wyjątku

Użyłem zewnętrznego interfejsu API dla niektórych operacji na plikach, w których maksymalny rozmiar pliku był ładowany z pliku właściwości. Wszystko było w porządku w moim lokalnym środowisku testowym. Jak tylko kod przeszedł do środowiska na żywo, maksymalny limit rozmiaru pliku nie działał w ogóle. Po dwóch dniach debugowania/analizy kodu, nie było żadnego sukcesu. Następnie z innych powodów wziąłem plik live constants.properties i debugowałem go za pomocą tego pliku. o_0

Po prostu chcę zapytać, co przeszkodziło im rzucić wyjątek na przepełnienie?

+3

Wydajność. Sprawdzenie przepełnienia po każdej operacji matematycznej jest kosztowne. Wymagałoby to porównania i oddziału, dla każdego dodania lub pomnożenia. – MTilsted

+0

[Dlaczego domyślnie języki nie powodują błędów w przepełnieniu liczby całkowitej?] (Http://stackoverflow.com/q/103654/995714) –

Odpowiedz

3

W wielu przypadkach Java jest oparta na C lub C++ i są one oparte na Zgromadzeniu. Przepełnienie/niedopełnienie jest ciche w C i C++ i prawie bezgłośne w montażu (chyba że zaznaczysz specjalne flagi). Wynika to prawdopodobnie z faktu, że C i C++ nie miały wyjątków, kiedy były po raz pierwszy proponowane. Jeśli chcesz zobaczyć przepełnienia/niedopełnienia, użyłeś większego typu. na przykład long long int lub long double;) Zestaw BTW ma coś podobnego do wyjątków zwanych pułapkami lub przerwań, przepełnienia/niedopełnienia nie powodują pułapki AFAIK.

Co wolę użyć: long i double, chyba że jestem pewien, że te typy są znacznie większe niż potrzebne. Nie możesz mieć urządzenia, które przepełnia rozmiar long.

+0

'Nie możesz mieć urządzenia, które przepełni się długim rozmiarem". To stwierdzenie ma wartość miliona punktów, prosty fakt, który na początku nie przychodzi mu do głowy. Dzięki. –

+1

Może pewnego dnia pojawi się jeden w Javie, ale plik musiałby mieć ponad 9 miliardów GB. –

+1

Być może w tamtych czasach dzisiejsze języki byłyby w I.T. muzea. –

1

Powodem jest "ponieważ specyfikacja języka Java mówi tak".

Section 4.2.2. Integer Operations z JLS mówi:

Operatorzy całkowitymi nie wskazują przepełnienia w jakikolwiek sposób.

+1

Dlaczego ta odpowiedź jest "nie pomocna"? (Ta odpowiedź jest poprawna) – Bohemian

+0

+1 niestety, SO społeczność czasami nie lubi prawdy – Ingo

+0

Pytanie szukało przyczyny, dla której język został stworzony w ten sposób (stąd słowo dlaczego), wskazując na specyfikację nie dostarcza żadnego uzasadnienia. –