Java.lang.NumberFormatException: For input string: ""

14 respostas
dionlan

Olá galera, uma dúvida bem simples, vi em alguns outros tópicos mas não tive muito sucesso...

Estou querendo usar um TextField para receber apenas INT, mas acabei tendo essa mensagem de exceção:

java.lang.NumberFormatException: For input string: ""
Erro na Inserção: For input string: ""
        at java.lang.NumberFormatException.forInputString(NumberFormatException.java:65)
        at java.lang.Integer.parseInt(Integer.java:493)
        at java.lang.Integer.parseInt(Integer.java:514)
        at CadastroAcao.btSalvarActionPerformed(CadastroAcao.java:494)
        at CadastroAcao.access$200(CadastroAcao.java:25)
        at CadastroAcao$3.actionPerformed(CadastroAcao.java:118)
        at javax.swing.AbstractButton.fireActionPerformed(AbstractButton.java:2012)
        at javax.swing.AbstractButton$Handler.actionPerformed(AbstractButton.java:2335)
        at javax.swing.DefaultButtonModel.fireActionPerformed(DefaultButtonModel.java:404)
        at javax.swing.DefaultButtonModel.setPressed(DefaultButtonModel.java:259)
        at javax.swing.plaf.basic.BasicButtonListener.mouseReleased(BasicButtonListener.java:253)
        at java.awt.Component.processMouseEvent(Component.java:6175)
        at javax.swing.JComponent.processMouseEvent(JComponent.java:3267)
        at java.awt.Component.processEvent(Component.java:5940)
        at java.awt.Container.processEvent(Container.java:2105)
        at java.awt.Component.dispatchEventImpl(Component.java:4536)
        at java.awt.Container.dispatchEventImpl(Container.java:2163)
        at java.awt.Component.dispatchEvent(Component.java:4362)
        at java.awt.LightweightDispatcher.retargetMouseEvent(Container.java:4461)
        at java.awt.LightweightDispatcher.processMouseEvent(Container.java:4125)
        at java.awt.LightweightDispatcher.dispatchEvent(Container.java:4055)
        at java.awt.Container.dispatchEventImpl(Container.java:2149)
        at java.awt.Window.dispatchEventImpl(Window.java:2478)
        at java.awt.Component.dispatchEvent(Component.java:4362)
        at java.awt.EventQueue.dispatchEvent(EventQueue.java:604)
        at java.awt.EventDispatchThread.pumpOneEventForFilters(EventDispatchThread.java:275)
        at java.awt.EventDispatchThread.pumpEventsForFilter(EventDispatchThread.java:200)
        at java.awt.EventDispatchThread.pumpEventsForHierarchy(EventDispatchThread.java:190)
        at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:185)
        at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:177)
        at java.awt.EventDispatchThread.run(EventDispatchThread.java:138)

A linha 494:

acao.setCodAcao(Integer.parseInt(tf_codigo.getText().trim()));

Na classe Acao, eu estava tentando converter o inteiro para String e informar uma mensagem de erro, mais ou menos assim:

public void setCodAcao(int codAcao) throws NumberFormatException {

        String as = Integer.toString(codAcao);
        
        if (as != null && !as.equals("")) {

           this.codAcao = codAcao;
           
        }else {

           throw new NumberFormatException ("Ação não pode ter código vazio ou nulo");
        }

    }

Lembrando que na classe CadastroAcao estou usando o try/catch;

O objetivo é apenas tratar a exceção informando ao usuário quando não tenho nada digitado no textfield se por acaso ele quiser registrar uma ação com campos vazios ou nulos...

Alguém ajuda aí por favor....

Abraço, vlw!

14 Respostas

Diabo_Loiro

antes de dar Integer.parseInt verifica se o valor é “” ou null.

dionlan
cara, cheguei até testar dessa forma:
if (tf_codigo.getText().isEmpty() || tf_codigo.getText().length() > 0 || tf_codigo != null && tf_codigo.equals("")) {
            acao.setCodAcao(Integer.parseInt(tf_codigo.getText().trim()));
            } else {

            throw new NumberFormatException("Ação não pode ter código vazio ou nulo");

            }
ViniGodoy

Seu código está um pouco confuso... Por que o método setCodAcao pega um valor que já é inteiro, converte para String e depois testa se não está vazio?
É impossível um inteiro ter o valor vazio.

Na classe acao, no máximo vc irá testar se o código era negativo ou zero, e dar um erro nesses casos:
public void setCodAcao(int codAcao) throws NumberFormatException {
   if (codAcao < 1) 
      throw new IllegalArgumentException("A ação não pode ter o código menor que 1!");

   this.codAcao = codAcao;
}

O tratamento você fará na tela:

try {
   acao.setCodAcao(Integer.parseInt(tf_codigo.getText().trim()));   //Quem dá erro é esse Integer.parseInt, não o seu método.
} catch (NumberFormatException e) { //Indica que o sujeito colocou um valor que não é convertível para inteiro
   JOptionPane.showMessageDialog(this, "Ação não pode ter código vazio"); //Removi o "ou nulo", pois o usuário é incapaz de inserir nulo num JTextField.
}
dionlan

Obrigadão pela resposta…
testei aqui e não pude listar os dados de minha tabela (que por sinal estou usando DefaultTableModel :smiley: :smiley: )

“ocurred inside setter of Acao.Acao.codAcao”

frankwco

não utilize default table model

http://www.guj.com.br/posts/list/15/199067.java#1001295

dionlan

Será que tem alguma coisa a ver de estar usando o codAcao como chave primária??? PQ fiz um teste aqui com o valorUnit da ação e deu certo…

No aguardo… té logo

dionlan

o problema é que tenho que tratar a exceção…
Quando não insiro nada no textfield e peço pra gravar, no e.printStackTrace() aparece a seguinte exceção:

Erro na Inserção: For input string: "" at java.lang.NumberFormatException.forInputString(NumberFormatException.java:65) at java.lang.Integer.parseInt(Integer.java:493) at java.lang.Integer.parseInt(Integer.java:514) at CadastroAcao.btSalvarActionPerformed(CadastroAcao.java:499) at CadastroAcao.access$200(CadastroAcao.java:26) at CadastroAcao$3.actionPerformed(CadastroAcao.java:120) at javax.swing.AbstractButton.fireActionPerformed(AbstractButton.java:2012) at javax.swing.AbstractButton$Handler.actionPerformed(AbstractButton.java:2335) at javax.swing.DefaultButtonModel.fireActionPerformed(DefaultButtonModel.java:404) at javax.swing.DefaultButtonModel.setPressed(DefaultButtonModel.java:259) at javax.swing.plaf.basic.BasicButtonListener.mouseReleased(BasicButtonListener.java:253) at java.awt.Component.processMouseEvent(Component.java:6175) at javax.swing.JComponent.processMouseEvent(JComponent.java:3267) at java.awt.Component.processEvent(Component.java:5940) at java.awt.Container.processEvent(Container.java:2105) at java.awt.Component.dispatchEventImpl(Component.java:4536) at java.awt.Container.dispatchEventImpl(Container.java:2163) at java.awt.Component.dispatchEvent(Component.java:4362) at java.awt.LightweightDispatcher.retargetMouseEvent(Container.java:4461) at java.awt.LightweightDispatcher.processMouseEvent(Container.java:4125) at java.awt.LightweightDispatcher.dispatchEvent(Container.java:4055) at java.awt.Container.dispatchEventImpl(Container.java:2149) at java.awt.Window.dispatchEventImpl(Window.java:2478) at java.awt.Component.dispatchEvent(Component.java:4362) at java.awt.EventQueue.dispatchEvent(EventQueue.java:604) at java.awt.EventDispatchThread.pumpOneEventForFilters(EventDispatchThread.java:275) at java.awt.EventDispatchThread.pumpEventsForFilter(EventDispatchThread.java:200) at java.awt.EventDispatchThread.pumpEventsForHierarchy(EventDispatchThread.java:190) at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:185) at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:177) at java.awt.EventDispatchThread.run(EventDispatchThread.java:138)

Parece que quando pego a informação ela vem no formato String e não converte… O que há de erradoo??

Obrigado.

ViniGodoy

Você chegou a testar o código do jeito que postei para você?

Tenho certeza de que funciona.

dionlan

Eaí Vini…

Sim sim, está exatamente igual…
Funciona perfeitamente quando insiro valores negativos… Agora não funciona quando tento gravar com o textfield em branco ou com algum tipo de string, aparecendo a mensagem de erro que eh o título do topico. :?

obrigadao

ViniGodoy

Posta seu código corrigido então, por favor.

dionlan

Dei uma mudada no idAcao (que era int), o mesmo virou nomeAcao por melhor especificação de requisitos...
Nos atributos do tipo String sem problemas, agora por exemplo na qtd e no valorUnit tenho problemas quando vou fazer alguns testes (gravar sem informar nada ou se digitar caracteres)

package Acao;

/**
 *  Classe bean Acao com as caracteristicas e com o metodo construtor e seus getters and setters
 * @author dionlan
 */

public class Acao {
    
    private String nomeAcao;
    private String nomeEmpresa;
    private double valorUnit;
    private int qtd;
    private boolean ordNom;
    private boolean preNom;
    private String data;

    /**
     * @return the nomeacao
     */
    public String getNomeAcao() {
        return nomeAcao;
    }

    /**
     * @param nomeAcao the nomeAcao to set
     */
    public void setNomeAcao(String nomeAcao) throws IllegalArgumentException{

        if (nomeAcao != null && !nomeAcao.equals("")) {

        this.nomeAcao = nomeAcao;
        } else {
        throw new IllegalArgumentException("Ação não pode ter nome vazio ou nulo.");
        }
    }

    /**
     * @return the nomeEmpresa
     */
    public String getNomeEmpresa() {
        return nomeEmpresa;
    }

    /**
     * @param nomeEmpresa the nomeEmpresa to set
     */
    public void setNomeEmpresa(String nomeEmpresa) throws IllegalArgumentException{
        if (nomeEmpresa != null && !nomeEmpresa.equals("")) {
        this.nomeEmpresa = nomeEmpresa;
        }else {
        throw new IllegalArgumentException("Ação não pode ter nome da empresa vazio ou nulo");
        }

    }

    /**
     * @return the valorUnit
     */
    public double getValorUnit() {
        return valorUnit;
    }

    /**
     * @param valorUnit the valorUnit to set
     */
    public void setValorUnit(double valorunit) throws NumberFormatException {


        if (valorunit < 0.10) {

            throw new IllegalArgumentException("Acao nao pode ter seu valor unitario menor que 0,10 centavos");
        }
        this.valorUnit = valorunit;
    }
    /**
     * @return the qtd
     */
    public int getQtd() {
        return qtd;
    }

    /**
     * @param qtd the qtd to set
     */
    public void setQtd(int qtd) throws NumberFormatException {
        if (qtd < 1)
           throw new IllegalArgumentException("A ação não pode ter quantidade menor que 1!");

    this.qtd = qtd;
    }
    /**
     * @return the ordNom
     */
    public boolean isOrdnom() {
        return isOrdNom();
    }

    /**
     * @param ordNom the ordNom to set
     */
    public void setOrdnom(boolean ordNom) {
        this.setOrdNom(ordNom);
    }

    /**
     * @return the prenNom
     */
    public boolean isPreNom() {
        return preNom;
    }

    /**
     * @param prenNom the prenNom to set
     */
    public void setPreNom(boolean preNom) {
        this.preNom = preNom;
    }

    /**
     * @return the data
     */
    public String getData() {
        return data;
    }

    /**
     * @param data the data to set
     */
    public void setData(String data) {
        this.data = data;
    }
    /**
     * @return the ordNom
     */
    public boolean isOrdNom() {
        return ordNom;
    }

    /**
     * @param ordNom the ordNom to set
     */
    public void setOrdNom(boolean ordNom) {
        this.ordNom = ordNom;
    }
}

E o ActionPerformed que salva no bd as informações digitadas no formulario:

private void btSalvarActionPerformed(java.awt.event.ActionEvent evt) {                                         

            PesquisaAcoes();
        try {
            /**
             * SessionFactory armazena os mapeamentos e as configuracoes do hibernate
             * objeto session armazenando os mapeamentos
             * Configuration() = recebe os parametros de configuracao do XML, do hibernate
             * por meio do configure
             * buildSessionFactory() retorna os objeto do tipo SessionFactory, obter os dados da sessao
             */
            /*
             * Abrindo uma sessao: abrindo session pelo session.openSession
             * estando apto a iniciar o processo de manipulacao no banco de dados
             */
            Session sessao = session.openSession();
            /**
             * definindo os valores e informacoes aos atributos
             */
            Acao acao = new Acao();
            acao.setNomeAcao(tf_nome.getText().trim());
            acao.setNomeEmpresa(tf_nomeEmpresa.getText().trim());
            acao.setValorUnit(Double.parseDouble(tf_valorUnit.getText()));
            acao.setQtd(Integer.parseInt(tf_qtd.getText().trim()));
            acao.setData(jl_dh.getText());

            if (jrbON.isSelected()) {
                jrbPN.setSelected(false);
                acao.setOrdnom(true);

            } else {

                jrbON.setSelected(false);
                acao.setPreNom(true);
            }
            /**
             * Para gravar no bd, precisa-se inicar uma transacao de dados, até entao as informacoes estao somente nos atributos
             * Transection ira iniciar a sessao beginTransection();
             */
            Transaction tx_acao = sessao.beginTransaction();
            /**
             * salvar no banco de dados, passando o objeto acao
             */
            sessao.save(acao);
            /**
             * Comitando as informacoes do transection
             */
            tx_acao.commit();
            /**
             * fechando sessao
             */
            sessao.close();
            preencher_jtable();

            JOptionPane.showMessageDialog(null, "Gravado com sucesso");
                
        } catch (NumberFormatException er) {

            er.printStackTrace();
            System.out.println("Erro na Inserção: " + er.getMessage());
            JOptionPane.showMessageDialog(this, "Erro na Inserção: " + er.getMessage());

        } catch (IllegalArgumentException e) {

            e.printStackTrace();
            System.out.println("Erro na inserção: " + e.getMessage());
            JOptionPane.showMessageDialog(this, "Erro na inserção: " + e.getMessage());

        } catch (ConstraintViolationException v) {

            v.printStackTrace();
            System.out.println("Erro na inserção: " + v.getMessage());
            JOptionPane.showMessageDialog(this, "Erro na inserção: " + v.getMessage());

        }
    }

vlwwww

ViniGodoy

Cara, essa exception: } catch (NumberFormatException er) { er.printStackTrace(); System.out.println("Erro na Inserção: " + er.getMessage()); JOptionPane.showMessageDialog(this, "Erro na Inserção: " + er.getMessage()); }

É disparada justamente para avisar que o usuário inseriu Texto onde ele deveria ter inserido um inteiro.
Você não precisa imprimir a Stack dela, só pedir ao seu usuário que insira números.

E o ideal seria testar por isso sempre que houver um “Integer.parseInt”, “Double.parseDouble” ou qualquer comando similar.

Um tratamento possível seria:

try {
   acao.setValorUnit(Double.parseDouble(tf_valorUnit.getText()));
} catch (NumberFormatException er) {  
   JOptionPane.showMessageDialog(this, "Por favor, informe um valor unitário!");
   tf_valorUnit.requestFocusInWindow();
}

O java só está acusando o erro porque informar um valor branco para onde se deve usar um valor numérico é mesmo um erro.

dionlan

Muito bem…
Deu certo, blz…
Mas pelo que entendi a a mensagem “Ação não pode ter código vazio ou nulo” vai ser exibida toda vez que ocorrer algum NumberFormatException né?
Se eu quiser individualizar e colocar uma mesagem para cada textfield por exemplo quando o usuario informa algum valor inválido e que esse textfield gere um NumberFormat?

vlw pela atenção cara.

ViniGodoy

Tem que escrever um try…catch para cada JTextField. Ou faça um método para isso:

public int lerInteiro(String nomeCampo, JTextComponent txtComponent) { try { return Integer.parseInt(txtComponent.getText().trim()); } catch (Exception e) { JOptionPane.showMessageDialog(this, "Você deve inserir um valor inteiro no campo " + campo + "!"); txtComponent.requestFocusInWindow(); } }

E aí usa assim:

acao.setQtd(lerInteiro(tf_qtd));

Faça também uma versão Double do método.

Criado 26 de dezembro de 2010
Ultima resposta 5 de jan. de 2011
Respostas 14
Participantes 4