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;
}