Widząc, że Java nie ma typów zerujących, ani nie ma TryParse(), jak radzić sobie z sprawdzaniem danych wejściowych bez zgłaszania wyjątków?Ciąg do Int w java - Prawdopodobnie złe dane, należy unikać wyjątków
Zwykłym sposobem:
String userdata = /*value from gui*/
int val;
try
{
val = Integer.parseInt(userdata);
}
catch (NumberFormatException nfe)
{
// bad data - set to sentinel
val = Integer.MIN_VALUE;
}
mogę użyć wyrażenia regularnego, aby sprawdzić, czy to parsowalnym, ale to wydaje się dużo napowietrznych, jak również.
Jaka jest najlepsza praktyka w radzeniu sobie z tą sytuacją?
EDYCJA: Uzasadnienie: Dużo się mówi na temat obsługi wyjątków, a ogólna opinia jest taka, że wyjątki powinny być używane tylko w przypadku nieoczekiwanych scenariuszy. Jednak uważam, że złe dane wejściowe użytkownika są OCZEKIWANE, a nie rzadkie. Tak, to naprawdę jest punkt akademicki.
Kolejne edycje:
Niektóre z odpowiedzi wykazać dokładnie to, co jest nie tak z SO. Ignorujesz pytanie, które zadajesz, i odpowiadasz na inne pytanie, które nie ma z tym nic wspólnego. Pytanie nie pyta o przejście między warstwami. Pytanie nie pyta, co zwrócić, jeśli liczba nie jest parsowana. Dla wszystkich, których znasz, val = Integer.MIN_VALUE; jest dokładnie odpowiednią opcją dla aplikacji, z której powstał ten całkowicie wolny od kontekstu fragment kodu.
wejścia Bad użytkownika jest zawsze oczekiwano. Masz całkowitą rację. Z tego powodu nie powinien mieć próby/catch. C#> Java; przykładem! – core
http://msdn.microsoft.com/en-us/library/bb397679.aspx // ToInt32 może wygenerować wyjątek FormatException lub OverflowException. spróbuj { numVal = Convert.ToInt32 (wejście); } } catch (FormatException e) { Console.WriteLine ("Ciąg wejściowy nie jest ciągiem cyfr."); } } catch (OverflowException e) { Console.WriteLine ("Liczba nie mieści się w Int32."); } wreszcie { } niiiiiceeee! –
@AndrewFink Oh, ale nawet jeśli był to ważny punkt (OP mówił o TryParse, który nie ma) liczba, która nie pasuje * jest * nieoczekiwana. –