java.lang.NumberFormatException: для входной строки: "" - PullRequest
3 голосов
/ 13 сентября 2010

При запуске этого кода:

JTextField ansTxt;
...
ansTxt = new JTextField(5);
String aString = ansTxt.getText();
int aInt = Integer.parseInt(aString);

Почему я получаю эту ошибку?

Исключение в потоке "AWT-EventQueue-0".

UPDATE:

JTextField ansTxt;
ansTxt = new JTextField(5);

ansTxt.addKeyListener(new KeyAdapter() {
   public void keyReleased(KeyEvent e) {
    ansTxt = (JTextField) e.getSource();
    String aString = ansTxt.getText().trim();
    int aInt = Integer.parseInt(aString);
   }
}

Ответы [ 5 ]

3 голосов
/ 13 сентября 2010

Целочисленный аргумент для конструктора JTextField на самом деле ширина в количестве столбцов.Из документов:

public JTextField(int columns)

Создает новый пустой TextField с указанным количеством столбцов.Модель по умолчанию создана, и начальная строка установлена ​​в нуль.

Создав его с помощью

ansTxt = new JTextField(5);

, вы в основном получите пустое текстовое поле (немного шире , чем если бы выпостроил это, используя конструктор без аргументов).Если вы хотите, чтобы он содержал строку «5», вы должны написать

ansTxt = new JTextField("5");
Обновление: IIRC, вы получите одно событие для keyDown, одно для keyTyped и одно для keyUp.Предположительно, текстовое поле еще не было обновлено в событии keyDown.В любом случае я предлагаю вам инкапсулировать Integer.parseInt в блоке
try { ... } catch (NumberFormatException e) { ... }
, поскольку пользователь вполне может написать что-то еще, кроме целого числа.->
2 голосов
/ 13 сентября 2010

Вы пытаетесь проанализировать пустую строку как int, которая не работает.Какой int должен "" быть проанализирован как?JTextField должен иметь текст, который можно анализировать.

ansTxt.addKeyListener(new KeyAdapter() {
    public void keyReleased(KeyEvent e) {
        ansTxt = (JTextField) e.getSource();
        try {
            int aInt = Integer.parseInt(ansTxt.getText());
            //Do whatever you want with the int
        } catch(NumberFormatException nfe) {
            /*
             * handle the case where the textfield 
             * does not contain a number, e.g. show
             * a warning or change the background or 
             * whatever you see fit.
             */
        }
    }
}

Вероятно, не очень хорошая идея устанавливать ansTxt внутри KeyAdapter.Я бы предложил вам использовать для этого локальную переменную.Это также облегчает перевод адаптера в «настоящий» класс вместо анонимного.

1 голос
/ 22 февраля 2011

Используйте метод trim().

int m=Integer.parseInt(txtfield.getText().trim());  

метод trim() удалит любую строку, присоединенную к номеру.

0 голосов
/ 13 сентября 2010

Ваш KeyAdapter будет запущен до того, как ваш ansText обработает KeyEvent. На самом деле, вы можете e.consume() вообще запретить ansText его обрабатывать. Поэтому при первом нажатии и отпускании клавиши значение ansText.getText() все равно будет "". Вот почему вы получаете исключение в первый раз. Двойное нажатие цифровой клавиши должно работать во второй раз.

0 голосов
/ 13 сентября 2010

Попробуйте ввести библиотеку Apache " commons Lang " в свой проект, и для последней строки вы можете сделать

int aInt = 0;
if(StringUtils.isNotBlank(aString) && StringUtils.isNumeric(aString) ){
    aInt = Integer.parseInt(aString);
}

редактировать: не уверен, почему понизить. JtextField будет принимать любую строку. Если текстовое поле прослушивает каждое нажатие клавиши, каждое введенное нечисловое значение (включая пустое) будет генерировать исключение NumberFormatException. Лучше всего проверить, является ли он числовым, прежде чем делать что-либо с новым значением.

edit2: согласно комментариям Томаса ниже. Я выполнил тест, чтобы сравнить способ try / catch и StringUtils для решения этой проблемы. Тест проводился 5 миллионов раз для каждого. Среднее время попытки / улова составило 21 секунду. Среднее время для StringUtils составило 8 секунд. Таким образом, использование StringUtils для больших нагрузок значительно быстрее. Если нагрузка на код невелика, вы заметите, что разницы мало. Испытательный пробег был

try{
   result = Integer.parseInt(num);
}catch(NumberFormatException ex){
   result = -1;
}

против

if(StringUtils.isNotBlank(num) && StringUtils.isNumeric(num)){
   result = Integer.parseInt(num);
}else{
   result = -1;
}

каждый проход по циклу генерировал новую случайную строку из 10 цифр, чтобы избежать какой-либо оптимизации в циклах оператора if. Это добавило 6-7 секунд накладных расходов.

...