Recursividade e Tratamento de Exceções!

2 respostas
ArchV

Olá!
Em um determinado instante do programa (Agenda que estou implementando), tenho a seguinte situação:

  • O usuário irá inserir uma String através do JOptionPane.showInputDialog. No entanto, após isso preciso tratar essa string para ver se realmente, o usuário inseriu no formato que eu especifiquei quando instânciei o SimpleDateFormat(“dd/MM/yyyy”) e se a string realmente é uma data Válida, para isso eu settei no SimpleDateFormat o método setLenient(false). Ok! até aqui perfeito, tudo funcionando corretamente. Se o usuário entrar com uma entrada inválida ele vai lançar a exceção e vai imprimir em um JOptionPane que a entrada é inválida; Até aqui tudo conforme planejado.
    Contudo, quis tratar caso o usuário settar null (e não desprezar lançando uma simples Excepiton, pois pode ter sido sem querer que ficou null - por exemplo fechar o JOptionPane retorna null, consequentemente ele iria mostrar a msg de erro: data inválida. Aí o usuário pergunta: - Ora, como data inválida se eu não settei a data), portanto resolvi fazer esse tratamento para a String.

Agora que eu expliquei o que eu quero fazer, vou fazer uma simulação de execução do programa e dizer onde vai aparecer o erro.

  • … foi chamado o método (com o seguinte argumento, null) inserirData(null)
    Portanto, ao entrar no método inserirData ele vai parar no primeiro if que relaciona a String caso ela seja null.
    Agora, ele vai lançar a menssagem através do OptionPane dizendo se o usuário realmente queria ter deixo em branco o campo, porém o usuário através do confirmDialog pode escolher entre: OK, Cancel e Close, logo tratei isso através de um SwitchCase.
    -Supondo que o usuário vai e seleciona OK. Consequentemente cai no primeiro Case que vai pedir novamente a string através do InputDialog após isso eu passo essa string e chamo este método inserirData(String ) passando a string que o usário digitou, supondo que o usuário não setou null, supondo que ele settou o valor para string = “A” e isso irá gerar a exceção do ParseException que consequentemente mostra a menssagem do JOptionPane, ele até mostra. Mas, no console aparece o seguinte erro:
Exception in thread "AWT-EventQueue-0" java.lang.NullPointerException
        at java.text.SimpleDateFormat.parse(SimpleDateFormat.java:1235)
        at java.text.DateFormat.parse(DateFormat.java:335)
        at Agenda.inserirData(Agenda.java:101)
        at Agenda.actionPerformed(Agenda.java:136)
...

Aí vem minha pergunta: Porquê esta ocorrendo este outro tipo de Exception, alguem consegue entender o porque? analísei o código várias vezes e não entendo. Acreditava que iria acontecer a mesma ParseException e tudo iria correr novamente como era de se esperar.

(Desculpe pelo texto extremamente extenso, não consegui resumir muito este problema)

Atenciosamente, ArchV.

----------------------Programa--------------------------------------

String stringData = JOptionPane.showInputDialog(null,"Digite a data a ser pesquisada: (dd/MM/yyyy)");
           if(inserirData(stringData) == true)
          {
               // apartir daqui eu sei que o usuário inseriu uma data válida e consequentemente, chamo o FileWriter encapsulado pelo BufferedWriter.
          }

Como pode se perceber no código acima, irá ocorrer a chamada do método inserirData(stringData).

public boolean inserirData(String inserirData)
    {
        if(inserirData == null)
        {
           
           optionPane  = JOptionPane.showConfirmDialog(null,"O Campo não foi preenchido, deseja preencher?","Data null",JOptionPane.OK_CANCEL_OPTION);
           switch(optionPane)
           {
               case(JOptionPane.OK_OPTION):
                   stringData = JOptionPane.showInputDialog(null,"Digite a data a ser inserida na agenda: (dd/MM/yyyy)");
                   inserirData(stringData);
                   break;
               case(JOptionPane.CANCEL_OPTION):
                   return false;
                   
               case(JOptionPane.CLOSED_OPTION):
                   return false;  
           }

        }
        dateFormater = new SimpleDateFormat("dd/MM/yyyy");
        dateFormater.setLenient(false);
        try 
        {
           myDate = dateFormater.parse(inserirData);
           formatada = dateFormater.format(myDate);
        }
        catch (ParseException ex) 
        {
            JOptionPane.showMessageDialog(null, "Data Inválida!", "Erro!", JOptionPane.ERROR_MESSAGE);
            return false;
        }
        
        return true;
        
        
    }

2 Respostas

ViniGodoy

Quando vc cair no case, você vai parar no método inserir data novamente, certo?. Esse método roda e, ao terminar a execução, voltará no ponto do case onde parou.

O código então irá para a parte de baixo do seu programa, com a variável ainda vazia.

Para corrigir, troque para:

case(JOptionPane.OK_OPTION) { stringData = JOptionPane.showInputDialog(null,"Digite a data a ser inserida na agenda: (dd/MM/yyyy)"); return inserirData(stringData); }

Assim, o inserir data que for chamado por último dará o veredito se retorno deve ser true ou false.

ArchV

ViniGodoy:
Quando vc cair no case, você vai parar no método inserir data novamente, certo?. Esse método roda e, ao terminar a execução, voltará no ponto do case onde parou.

O código então irá para a parte de baixo do seu programa, com a variável ainda vazia.

Para corrigir, troque para:

case(JOptionPane.OK_OPTION) { stringData = JOptionPane.showInputDialog(null,"Digite a data a ser inserida na agenda: (dd/MM/yyyy)"); return inserirData(stringData); }

Assim, o inserir data que for chamado por último dará o veredito se retorno deve ser true ou false.

Muito obrigado, ViniGodoy!
Funcionou perfeitamente, Agradeço!
Entendi agora como tratar melhor os “return”.
Falô!

Criado 14 de janeiro de 2010
Ultima resposta 15 de jan. de 2010
Respostas 2
Participantes 2