2013-06-13 8 views
8

Widziałem dwa style sprawdzania, czy zmienna jest poprawną liczbą całkowitą w Javie. Jeden wykonując Integer.parseInt i przechwytując wynikowy wyjątek. Innym jest użycie Pattern. Które z poniższych rozwiązań jest lepsze?Co jest lepsze - Integer.parseInt() i złap wyjątek lub zweryfikuj ciąg ze wzorcem przed konwersją?

String countStr; 
int count; 
try { 
    count = Integer.parseInt(countStr); 
} catch (Exception e) { 
    //return as the variable is not a proper integer. 
    return; 
} 

lub

String integerRegex = "([0-9]{0,9})"; 
if (countStr.isEmpty() || !Pattern.matches(integerRegex, countStr)) { 
    //return as the variable is not a proper integer. 
    return; 
} 

Edycja: My tu pytanie brzmi, czy robi Integer.parseInt() i połowu wyjątek dla walidacji standardowy sposób sprawdzania poprawności int? Przyznaję, że moje regex nie jest doskonałe. Ale czy istnieją jakieś wbudowane metody dostępne w Javie do sprawdzania poprawności int? Właściwie nie lepiej jest przeprowadzić jakąś walidację zamiast po prostu uchwycić wyjątek?

+0

Wyrażenie regularne nie sprawdza liczb ujemnych. –

+0

W zależności od sytuacji. –

+2

co się stanie, jeśli zaznaczysz "2147483647", "2147483650" lub "" z wyrażeniem regularnym? –

Odpowiedz

8

Korzystanie z powyższego podejścia jest lepsze, ponieważ uwzględnia wszystkie rodzaje możliwych błędów i obsługuje wszystkie przypadki. Na przykład to, co napisałeś, nie będzie poprawnie analizować liczb ujemnych.

To ma sens tylko napisać własnego weryfikatora, jeśli chcesz sprawdzić poprawność danego podzbioru wszystkich liczb całkowitych.

Ogólna porada: nie wynajduj ponownie koła, chyba że masz ku temu ważne powody.

+0

Tak. Moje wyrażenie regularne sprawdza tylko liczby dodatnie. Ale czy robi Integer.parseInt() i wyłapuje wyjątek dla sprawdzania poprawności w standardowy sposób? Czy istnieją jakieś wbudowane metody dostępne do sprawdzania poprawności? – afxgx

+2

Tak, to jest standardowy sposób sprawdzania poprawności liczby całkowitej. –

+0

@afxgx Biorąc pod uwagę, że prawie niemożliwe jest napisanie wyrażenia regularnego, które zajmie się wszystkimi przypadkami (2^31 jest idealnie cienką liczbą całkowitą, ale rzuci wyjątek podczas próby przeanalizowania go, ponieważ jest zbyt duży), jest to wyjątkowo zły pomysł. Regex, który zajmuje się wszystkimi przypadkami, jest oczywiście możliwy, ale będzie naprawdę, naprawdę długi .. – Voo

3

Te dwie funkcje służą różnym celom. Jeśli chcesz tylko upewnić się, że łańcuch zawiera określony wzór, użyj drugiego podejścia. Jeśli chcesz go przekonwertować, powinieneś móc parseInt() W takim przypadku nie ma sensu go sprawdzać i konwertować. Jeśli jednak masz określone wymagania dotyczące liczby, być może będziesz musiał najpierw ją sprawdzić, ponieważ parseInt() nie zawsze może wyrzucić wyjątek, jeśli potrafi on parsować coś, co wciąż nie spełnia Twoich wymagań.

-1

Jeśli po prostu walidujesz liczbę całkowitą, myślę, że druga droga jest lepsza.

Obie te metody będą działały dobrze, ale oczywiście będą miały inną ostrość. Ta pierwsza koncentruje się na samej transformacji, podczas gdy ta druga jest wyraźnie bardziej uważnie sprawdzana. I chcesz sprawdzić numer, więc myślę, że druga metoda jest lepsza. Sądzę też, że część drugiej metody jest bardziej czytelna, pozwalając na łatwe utrzymanie kodu, gdzie logika polega na sprawdzaniu poprawności liczby zamiast łańcucha na liczbę.

+2

Tyle tylko, że wyrażenie regex zwraca wartość true, nie oznacza, że ​​możesz faktycznie reprezentować go jako 32-bitową liczbę całkowitą. – Voo

4

Istnieje naprawdę dobry powód, aby nie iść z drugim podejściem, jeśli rzeczywiście chcesz sprawdzić, czy dany ciąg może być reprezentowany jako 32-bitowa liczba całkowita, a nie tylko, że reprezentuje liczbę całkowitą w sensie matematycznym.

Jestem pewien, że wszyscy zgadzamy się, że 2147483648 (2 ** 31 dla osób zwracających uwagę) jest idealnie cienką liczbą całkowitą, ale jest to tylko jedna z nieskończenie wielu liczb, dla których dwie opcje dadzą różne wyniki. Jeśli więc chcesz sprawdzić, czy możesz reprezentować ciąg jako 32-bitową liczbę całkowitą, użyj metody parseInt, jeśli chcesz tylko sprawdzić, czy jest to liczba całkowita, skorzystaj z wyrażenia regularnego.

PS: Mimo to nie złapać wyjątek, ale poprawna wyjątek numberFormat zamiast ..

+0

@Marco Sorry but really really nie widzisz swojego punktu? – Voo

+1

maksymalna wartość to 2^31-1, a nie 2^31 –

+0

@Marco Mam nadzieję, że po tym wszystkim, cały czas należy znaleźć wartość, która * nie może * być reprezentowana jako 'int'. – Voo

Powiązane problemy