Ошибка преобразования из String в int в Vaadin - PullRequest
0 голосов
/ 15 января 2020

Я пытаюсь преобразовать строку в int в Vaadin. Вот код:

TextField name = new TextField();
int num;
num = Integer.parseInt(String.valueOf(name.getValue()));
Paragraph greeting = new Paragraph("");
Button button = new Button("Result", event -> {
    greeting.setText(" " + num * 500);
});
add(name, button, greeting);

А вот и ошибка:

There was an exception while trying to navigate to '' with the exception message 'Error creating bean with name 'com.gmail.ilim.MainView': Instantiation of bean failed; nested exception is org.springframework.beans.BeanInstantiationException: Failed to instantiate [com.gmail.ilim.MainView]: Constructor threw exception; nested exception is java.lang.NumberFormatException: For input string: ""'

Ответы [ 2 ]

2 голосов
/ 15 января 2020

Как было сказано в комментариях:

1) анализирует входное значение только в списке щелчков кнопки, а не непосредственно в конструкторе представления (в этот момент TextField всегда будет пустым значение)

2) поймать исключение NumberFormatException. Даже если позаботиться о пункте 1, пользователь всегда может набрать не числовые данные c, которые не будут разбираться до Integer

TextField name = new TextField();
Paragraph greeting = new Paragraph("");
Button button = new Button("Result", event -> {
    int num;
    try {
        num = Integer.parseInt(String.valueOf(name.getValue()));
    } catch (NumberFormatException e) {
        num = 0; // your default value
        // you should also let the user know he didnt enter a valid number
        Notification.show("Please enter a valid number");
    }
    greeting.setText(" " + num * 500);
});
add(name, button, greeting);

Другая возможность состоит в непосредственном использовании IntegerField вместо TextField. Это доступно только для Vaadin 14.1.x

Еще одна возможность, которая приходит мне в голову, это использование Binder - при связывании textField вы можете добавить StringToIntegerConverter. Это будет немного сложнее, и я не буду go этот маршрут только для этого.

1 голос
/ 15 января 2020

Как говорили другие люди в комментариях, одним из решений было бы поймать исключение так:

try {
  num = Integer.parseInt(name.getValue());
} catch (NumberFormatException nfe) {
  num = 1; // your default value
}
...
...