Input dialog w Javie

Jaki jest najlepszy sposób na pobieranie numerów od użytkownika poprzez swingowe okienka? Aktualnie mam coś takiego:

 

private int giveInt(String message)
	{
		int result =0;
		boolean successful = false;
		String input;
		do{
			try {
				input=JOptionPane.showInputDialog(message);
				result = Integer.parseInt(input);
				successful = true;
			} catch (InputMismatchException ime) {
				JOptionPane.showMessageDialog(null, "Please enter an number");
            }
		}while (!successful);
		
		return result;
	}

Lecz gdy w wyskakującym okienku kliknę Cancel, okno nie pobiera rzadnej wartości i program nie może sparsować tego na integer. Jakie jest najlepsze wyjście z takiej sytuacji?

Spawdzić czy input jest równe/różne od null i zachować się w takiej sytuacji, tak jak chcemy, by działał nasz program? Ewentualnie chwycić NPE, ale moim zdaniem używanie wyjątków do sterowania programem to Code Smell.

To może łatwiej już będzie zrobić taki showInputDialog który będzie miał domyślnie ustawione na 0 i akceptował tylko liczby?

 

A jeżeli perfidny użytkownik usunie zero i zostawi puste pole?

No nie pomyślałem. Więc jaka opcja byłaby najlepsza?

W GUI musisz przywyknąć do tego, że większość rzeczy będzie toporna, po prostu użytkownik ma za duże możliwości wprowadzenia syfu. Stwórz sobie klasę pomocniczą: 

public final class MyJOptionPane {
	private static final String CLASSNAME = MyJOptionPane.class.getName();
	private static final Logger LOGGER = Logger.getLogger(CLASSNAME);

	public static int showEnforcedIntInputDialog(Object message) {
		while (true) {
			try {
				String val = JOptionPane.showInputDialog(message);
				return Integer.parseInt(val);
			} catch (NumberFormatException nfe) {
				LOGGER.logp(Level.SEVERE, CLASSNAME, "showEnforcedIntInputDialog", "Could not parse input as java.lang.String", nfe);
			}
		}
	}

}

I potem wszędzie tego używaj tak:

public static void main(String[] args) {
	int value = MyJOptionPane.showEnforcedIntInputDialog("Podaj liczbę");
	...
}