[RESOLVIDO] java.lang.NumberFormatException: empty String

Bom galera estou fazendo um software para controle de estoque estava tudo ocorrendo certo, agora na minha interface de vendas quando coloco para adicionar uma venda na minha tabela ela adiciona normal, mas se eu adicionar uma venda e o campo Desconto estiver sem nenhum valor ele dá o seguinte erro.
java.lang.NumberFormatException: empty String
e aponta para minha ViewVendas, segue o código da view.
´´´
package view;

import controller.ControllerCliente;
import controller.ControllerProdutos;
import controller.ControllerVendas;
import controller.ControllerVendasCliente;
import java.util.ArrayList;
import javax.swing.JOptionPane;
import javax.swing.table.DefaultTableModel;
import model.ModelCliente;
import model.ModelProdutos;
import model.ModelVendasCliente;

/**
*

  • @author Lucas Duarte
    */
    public class ViewVendas extends javax.swing.JFrame {
    ControllerCliente controllerCliente = new ControllerCliente();
    ModelCliente modelCliente = new ModelCliente();
    ArrayList listaModelClientes = new ArrayList<>();
    ControllerProdutos controllerProdutos = new ControllerProdutos();
    ModelProdutos modelProdutos = new ModelProdutos();
    ArrayList listaModelProdutos = new ArrayList<>();
    ArrayList listaModelVendasCliente = new ArrayList<>();
    ControllerVendasCliente controllerVendasCliente = new ControllerVendasCliente();
    ControllerVendas controllerVendas = new ControllerVendas();

    /**

    • Creates new form ViewVendas
      */
      public ViewVendas() {
      initComponents();
      listarClientes();
      listarProdutos();
      carregarVendas();
      preencherCodigoClientePeloComboBox();
      preencherCodigoProdutosPeloComboBox();
      }

    private void jtfNumVendaActionPerformed(java.awt.event.ActionEvent evt) {
    // TODO add your handling code here:
    }

    private void jcbClienteActionPerformed(java.awt.event.ActionEvent evt) {
    // TODO add your handling code here:
    }

    private void jtfCodClienteFocusLost(java.awt.event.FocusEvent evt) {
    // TODO add your handling code here:
    modelCliente = controllerCliente.getClienteController(Integer.parseInt(jtfCodCliente.getText()));
    jcbCliente.setSelectedItem(modelCliente.getCliNome());

    }

    private void jcbClientePopupMenuWillBecomeInvisible(javax.swing.event.PopupMenuEvent evt) {
    // TODO add your handling code here:
    if(jcbCliente.isPopupVisible()){
    preencherCodigoClientePeloComboBox();
    }
    }

    private void jcbProdutosPopupMenuWillBecomeInvisible(javax.swing.event.PopupMenuEvent evt) {
    // TODO add your handling code here:
    if(jcbProdutos.isPopupVisible()){
    preencherCodigoProdutosPeloComboBox();
    }
    }

    private void jtfCodProdutoFocusLost(java.awt.event.FocusEvent evt) {
    // TODO add your handling code here:
    modelProdutos = controllerProdutos.retornarProdutoController(Integer.parseInt(jtfCodProduto.getText()));
    jcbProdutos.setSelectedItem(modelProdutos.getProNome());
    }

    private void jbExcluirActionPerformed(java.awt.event.ActionEvent evt) {
    // TODO add your handling code here:
    int linha = jtVendas.getSelectedRow();
    int codigo = (int) jtVendas.getValueAt(linha, 0);
    if (controllerVendas.excluirVendasController(codigo)){
    JOptionPane.showMessageDialog(this, “Venda excluída com sucesso”, “Atenção”, JOptionPane.WARNING_MESSAGE);
    this.carregarVendas();
    }else{
    JOptionPane.showMessageDialog(this, “Erro ao excluir a venda”, “Erro”, JOptionPane.ERROR_MESSAGE);
    }
    }

    private void jbAdicionarActionPerformed(java.awt.event.ActionEvent evt) {
    // TODO add your handling code here:
    if(jtfQuantidade.getText().equals("")){
    JOptionPane.showMessageDialog(this, “Atenção ao cadastrar venda, preencha todos os campos”, “Atenção”, JOptionPane.WARNING_MESSAGE );
    }else{
    modelProdutos = controllerProdutos.retornarProdutoController(Integer.parseInt(jtfCodProduto.getText()));
    //ADICIONAR UMA LINHA NA TABELA
    DefaultTableModel modelo = (DefaultTableModel) jtProdutosVenda.getModel();
    int cont = 0;
    double quantidade = 0;
    quantidade = Double.parseDouble(jtfQuantidade.getText());
    for (int i = 0; i < cont; i++) {
    modelo.setNumRows(0);
    }

         modelo.addRow(new Object []{
         modelProdutos.getIdProduto(),
         modelProdutos.getProNome(),
         jtfQuantidade.getText(),
         modelProdutos.getProValor(),
         quantidade * modelProdutos.getProValor()
         });
         somarValorTotalProdutos();
     }
    

    }

    private void jtfDescontoFocusLost(java.awt.event.FocusEvent evt) {
    // TODO add your handling code here:
    somarValorTotalProdutos();
    }

    private void jbNovoActionPerformed(java.awt.event.ActionEvent evt) {
    // TODO add your handling code here:
    limparFormulários();
    }

    /**

    • @param args the command line arguments
      /
      public static void main(String args[]) {
      /
      Set the Nimbus look and feel /
      //
      /
      If Nimbus (introduced in Java SE 6) is not available, stay with the default look and feel.

      • For details see http://download.oracle.com/javase/tutorial/uiswing/lookandfeel/plaf.html
        */
        try {
        for (javax.swing.UIManager.LookAndFeelInfo info : javax.swing.UIManager.getInstalledLookAndFeels()) {
        if (“Nimbus”.equals(info.getName())) {
        javax.swing.UIManager.setLookAndFeel(info.getClassName());
        break;
        }
        }
        } catch (ClassNotFoundException ex) {
        java.util.logging.Logger.getLogger(ViewVendas.class.getName()).log(java.util.logging.Level.SEVERE, null, ex);
        } catch (InstantiationException ex) {
        java.util.logging.Logger.getLogger(ViewVendas.class.getName()).log(java.util.logging.Level.SEVERE, null, ex);
        } catch (IllegalAccessException ex) {
        java.util.logging.Logger.getLogger(ViewVendas.class.getName()).log(java.util.logging.Level.SEVERE, null, ex);
        } catch (javax.swing.UnsupportedLookAndFeelException ex) {
        java.util.logging.Logger.getLogger(ViewVendas.class.getName()).log(java.util.logging.Level.SEVERE, null, ex);
        }
        //

      /* Create and display the form */
      java.awt.EventQueue.invokeLater(new Runnable() {
      public void run() {
      new ViewVendas().setVisible(true);
      }
      });
      }
      private void preencherCodigoProdutosPeloComboBox(){
      modelProdutos = controllerProdutos.retornarProdutoController(jcbProdutos.getSelectedItem().toString());
      jtfCodProduto.setText(String.valueOf(modelProdutos.getIdProduto()));
      }

    private void preencherCodigoClientePeloComboBox(){
    modelCliente = controllerCliente.getClienteController(jcbCliente.getSelectedItem().toString());
    jtfCodCliente.setText(String.valueOf(modelCliente.getIdCliente()));
    }

    /** preenche o combo box com todos os clientes
    *
    */
    private void listarClientes(){
    listaModelClientes = controllerCliente.getListaClienteController();
    jcbCliente.removeAllItems();
    for (int i = 0; i < listaModelClientes.size(); i++) {
    jcbCliente.addItem(listaModelClientes.get(i).getCliNome());

     }
    

    }
    /*preenche o combo box com os produtos.
    *
    /
    private void listarProdutos(){
    listaModelProdutos = controllerProdutos.retornarListaProdutoController();
    jcbProdutos.removeAllItems();
    for (int i = 0; i < listaModelProdutos.size(); i++) {
    jcbProdutos.addItem(listaModelProdutos.get(i).getProNome());
    }
    }
    /

    • APLICA DESCONTOS AO VALOR FINAL DA VENDA
      */
      private void aplicarDescontos(){
      try {
      jtfValorTotal.setText(String.valueOf(
      Double.parseDouble(jtfValorTotal.getText())- Double.parseDouble(jtfDesconto.getText())));
      } catch (Exception e) {
      e.printStackTrace();
      }

    }

    /**

    • SOMA TODOS OS PRODUTOS DA VENDA
      */
      private void somarValorTotalProdutos(){
      double soma = 0, valor;
      int cont = jtProdutosVenda.getRowCount();
      for (int i = 0; i < cont; i++) {
      valor = (double) jtProdutosVenda.getValueAt(i, 4);
      soma = soma + valor;
      }
      jtfValorTotal.setText(String.valueOf(soma));
      aplicarDescontos();

    }

    private void carregarVendas(){
    DefaultTableModel modelo = (DefaultTableModel) jtVendas.getModel();
    listaModelVendasCliente = controllerVendasCliente.getListaVendasClienteController();
    int cont = listaModelVendasCliente.size();
    for (int i = 0; i < cont; i++) {
    modelo.addRow(new Object[]{
    listaModelVendasCliente.get(i).getModelVendas().getIdVenda(),
    listaModelVendasCliente.get(i).getModelCliente().getCliNome(),
    listaModelVendasCliente.get(i).getModelVendas().getVenDataVenda()
    });
    }

    }
    /**

    • LIMPAR FORMULÁRIO DE VENDAS
      */
      private void limparFormulários(){
      jtfQuantidade.setText("");
      jtfDesconto.setText("");
      jtfValorTotal.setText("");
      DefaultTableModel modelo = (DefaultTableModel) jtProdutosVenda.getModel();
      modelo.setNumRows(0);
      }
      ´´´

Esse erro ocorre quando vc tenta fazer parse de uma string vazia pra um tipo numérico.
O problema tá na sua lógica em estar passando uma string vazia pra dar parse.
Vc tem 6 parses no código. No erro que dá sempre mostra a linha, procure ela. Depois verifique pq está recebendo uma String vazia e resolva sua lógica. Não há mto mais q possa ser feito. Até poderia fazer um IF sobre a string pra n dar parse, mas somente se quiser ignorar o valor quando em branco.

Campo sem nenhum valor = String vazia.
Se está com String vazia, não vai ser possível converter em um número válido, certo?
Sugestão: Defina um valor padrão para o campo, como 0, por exemplo.
Isso resolve teu problema.

E como faria isso?

Como você define um texto num JTextField?

Obrigado, respirei um pouco e li a resposta novamente e entendi oque quis dizer era só atribuir para começar com um valor jtfDesconto.setText(“0”);

Outra solução, um tanto mais complexa, seria recuperar o valor do JTextField em questão em uma String, validar se está vazio e não converter

String sDesconto = jtfDesconto.getText();
Double desconto = sDesconto.trim().length() > 0 ? Double.parseDouble(sDesconto) : 0;

Acho que o código acima sintetiza o que estou falando