Как исправить исключение числового формата: пустая строка

В моем проекте я ставлю JTextField для установки общей суммы в счете-фактуре. Его зовут txtGtotal. Когда клиент платит аванс, он вводит его значение в txtAdvance JTextField, и я написал шнур для выпуска ключей txtAdvance, чтобы установить причитающийся платеж в txtDue JTextField. (Если клиент не заплатил аванс, он должен ввести 0 в txtAdvance, а txtDue также установить 0)

Ниже приведен мой шнур к ключевому событию.

private void txtAdvanceKeyReleased(java.awt.event.KeyEvent evt) {
    double gtotal = Double.parseDouble(txtGtotal.getText());
    double ad = Double.parseDouble(txtAdvance.getText());
    double due = gtotal - ad;
}

Мой вопрос заключается в том, что когда я очищаю числовое значение в txtAdvance и пытаюсь ввести другое числовое значение перед вводом, я получаю эту ошибку java.lang.NumberFormatException: пустая строка. Но после того, как я заменил это пустое txtAdvance jtextfeild числовым значением, система формулирует правильно. Как я могу остановить эту ошибку. Поскольку они показывают ошибку во второй строке шнура. которые создают переменную с именем double ad.


person Dilini    schedule 31.10.2013    source источник
comment
@ n4pgamer, не лучше ли просто добавить оператор if?   -  person Tafari    schedule 31.10.2013
comment
Если вы сгенерируете одно и то же событие несколько раз и у вас возникнут проблемы с продолжением, просто проигнорируйте его, чтобы будущие ошибки не соответствовали ключу, кодирующему структуру подписки.   -  person    schedule 31.10.2013
comment
@Tafari Я знаю, если заявление, которое приведено ниже, работает :)   -  person Dilini    schedule 31.10.2013
comment
@nikpon Я знаю это. У меня также нет ошибки после того, как я установил 0,00 для txtAdvance jextfeild. Но все же я хотел исправить и эту ошибку. Думаю, я нашел ответ.   -  person Dilini    schedule 31.10.2013
comment
@user2867987 user2867987 рад слышать это, вы новичок, поэтому можете этого не знать, поэтому небольшой совет, пожалуйста, примите правильный ответ, если он вам помог :)   -  person Tafari    schedule 31.10.2013
comment
@Tafari Вы близки к истине, но это должен быть правильный ответ.   -  person    schedule 31.10.2013
comment
@ user2867987 Ваш обработчик реагирует на каждое нажатие значения, сузьте выбор для \0xD или используйте другое событие.   -  person    schedule 31.10.2013
comment
@nipkon можешь сказать мне, что такое \0xD   -  person Dilini    schedule 31.10.2013


Ответы (3)


Как насчет очевидного решения:

private void txtAdvanceKeyReleased(java.awt.event.KeyEvent evt) {
    double gtotal = parseDouble(txtGtotal.getText());
    double ad = parseDouble(txtAdvance.getText());
    double due = gtotal - ad;
}

private double parseDouble(String s){
    if(s == null || s.isEmpty()) 
        return 0.0;
    else
        return Double.parseDouble(s);
}
person rzymek    schedule 31.10.2013
comment
Это выглядит как самое чистое решение для меня :) - person Todoy; 31.10.2013
comment
отлично, на самом деле это работает. :) Я хочу установить 0.00 на txtAdvance jextfeild. как установить этот возврат 0.0; значение на txtAdvance jextfeild. - person Dilini; 31.10.2013
comment
Вам необходимо настроить средства форматирования в JTextField: docs.oracle.com/javase /tutorial/uiswing/components/ - person rzymek; 31.10.2013
comment
не могли бы вы кратко сказать мне, какое форматирование я должен сделать. - person Dilini; 31.10.2013
comment
на самом деле я тоже так завязывал. если (txtAdvance.getText()==null || txtAdvance.getText().isEmpty()) { txtAdvance.setText(0.0); } else { double gtotal = Double.parseDouble(txtGtotal.getText()); двойное объявление = Double.parseDouble(txtAdvance.getText()); двойная сумма = gtotal - объявление; txtDue.setText(sdf.Money(из-за)); } И это работает. :) - person Dilini; 31.10.2013
comment
Я получил этот ответ, прототипируя ваш ответ, здорово, что вы, ребята - person Dilini; 31.10.2013

чтобы избавиться от ошибки пустой строки, вы можете выполнить простую проверку.

   private void txtAdvanceKeyReleased(java.awt.event.KeyEvent evt) {
      if(!txtGtotal.getText().trim().equals("") && !txtAdvance.getText().trim().equals("")){
        double gtotal = Double.parseDouble(txtGtotal.getText());
        double ad = Double.parseDouble(txtAdvance.getText());
        double due = gtotal - ad;
      }
    }
person Todoy    schedule 31.10.2013
comment
не могли бы вы сказать мне, что это за evt.getKeyCode() != 8 означает, почему 8? - person Dilini; 31.10.2013
comment
Я предполагаю, что использование постоянного числа было плохой идеей. Вместо этого следовало использовать константу, чтобы сделать ее более понятной, но теперь, когда я думаю об этом, в этом нет необходимости. - person Todoy; 31.10.2013
comment
Я получил это, но что я могу добавить в оператор else? Я хочу установить 0.00 для txtAdvance jextfeild. - person Dilini; 31.10.2013

Можно сказать, что действие не должно запускаться при нажатии Backspace, попробуйте так:

if(evt.getKeyCode() != 8){ //Backspace
    double gtotal = Double.parseDouble(txtGtotal.getText());
    double ad = Double.parseDouble(txtAdvance.getText());
    double due = gtotal - ad;
}
person Mikhail Timofeev    schedule 31.10.2013
comment
не могли бы вы рассказать мне еще раз, что это за evt.getKeyCode() != 8 означает, почему 8? - person Dilini; 31.10.2013
comment
каждая клавиша на клавиатуре имеет виртуальный номер. 8 означает возврат - person Mikhail Timofeev; 31.10.2013
comment
хорошо :) это тоже что-то новое и тоже работает. большой :) - person Dilini; 31.10.2013