Problemas com try catch

Estou tendo problemas na utilização do try catch.
Gostaria que ao invés de ele entrar no primeiro IF, tivesse um try cath que lançaria uma exceção NullPointerException, porém, do jeito que eu fiz, ele lança também se o contato não for encontrado
Alguém pode me ajudar?

Código com Try Catch

private void verificaExistenciaCliente(){// throws HeadlessException {
        try{
                Cliente clienteAux;
                String campoBusca = tfBusca.getText();
        }catch(NullPointerException e){
                JOptionPane.showMessageDialog(null, "Campo Vazio");
       }
            banco = new BancoDeDados();
            clienteAux = banco.buscarUsuario(campoBusca);
            if (clienteAux.getNome() == null) {
                JOptionPane.showMessageDialog(null, "Contato não cadastrado");
            } else {
                labelNome.setText("Nome: " + clienteAux.getNome());
                labelEndereco.setText("Endereço: " + clienteAux.getEndereco().getRua());
                labelNumero.setText("Número: " + clienteAux.getEndereco().getNumero());
                labelComp.setText("Complemento: " + clienteAux.getEndereco().getComplemento());
                labelBairro.setText("Bairro: " + clienteAux.getEndereco().getBairro());
                labelCep.setText("CEP: " + clienteAux.getEndereco().getCep());
                labelTelFixo.setText("Telefone Fixo: " + clienteAux.getTelFixo());
                labelTelCelular.setText("Telefone Celular: " + clienteAux.getTelCelular());
                labelReferencia.setText("Referência: " + clienteAux.getEndereco().getReferencia());
            }
        }
        banco.desconectar();
   

Código Original


private void verificaExistenciaCliente(){// throws HeadlessException {
        Cliente clienteAux;
        String campoBusca = tfBusca.getText();
        if (campoBusca.isEmpty()) {
            JOptionPane.showMessageDialog(null, "Campo Vazio");
        } else {
            banco = new BancoDeDados();
            clienteAux = banco.buscarUsuario(campoBusca);
            if (clienteAux.getNome() == null) {
                JOptionPane.showMessageDialog(null, "Contato não cadastrado");
            } else {
                labelNome.setText("Nome: " + clienteAux.getNome());
                labelEndereco.setText("Endereço: " + clienteAux.getEndereco().getRua());
                labelNumero.setText("Número: " + clienteAux.getEndereco().getNumero());
                labelComp.setText("Complemento: " + clienteAux.getEndereco().getComplemento());
                labelBairro.setText("Bairro: " + clienteAux.getEndereco().getBairro());
                labelCep.setText("CEP: " + clienteAux.getEndereco().getCep());
                labelTelFixo.setText("Telefone Fixo: " + clienteAux.getTelFixo());
                labelTelCelular.setText("Telefone Celular: " + clienteAux.getTelCelular());
                labelReferencia.setText("Referência: " + clienteAux.getEndereco().getReferencia());
            }
        }
        banco.desconectar();
   }

vasco.fred

Não consegui entender muito bem… mas pelo que entendi, você quer ao invez de enviar uma mensagem “Campo Vazio”, você quer levantar uma exceção com isto !!!
Se for assim, segue abaixo o código que pode fazer isto, repare que eu não preciso do try, catch, isto porque eu não quero tratar a exceção e sim propagar a mesma, para alguem que saiba o que fazer, trate a exceção da melhor forma possivel.

private void verificaExistenciaCliente() throws NullPointerException { String campoBusca = tfBusca.getText(); if (campoBusca.isEmpty()) { throw new NullPointerException("Campo Vazio"); } else { banco = new BancoDeDados(); Cliente clienteAux = banco.buscarUsuario(campoBusca); if (clienteAux.getNome() == null) { JOptionPane.showMessageDialog(null, "Contato não cadastrado"); } else { labelNome.setText("Nome: " + clienteAux.getNome()); labelEndereco.setText("Endereço: " + clienteAux.getEndereco().getRua()); labelNumero.setText("Número: " + clienteAux.getEndereco().getNumero()); labelComp.setText("Complemento: " + clienteAux.getEndereco().getComplemento()); labelBairro.setText("Bairro: " + clienteAux.getEndereco().getBairro()); labelCep.setText("CEP: " + clienteAux.getEndereco().getCep()); labelTelFixo.setText("Telefone Fixo: " + clienteAux.getTelFixo()); labelTelCelular.setText("Telefone Celular: " + clienteAux.getTelCelular()); labelReferencia.setText("Referência: " + clienteAux.getEndereco().getReferencia()); } } banco.desconectar(); }Att

Obg astork, me confundi.

Axei que no método eu já tratava, porém é quando eu vou utilizar, confere?

try{
            this.verificaExistenciaCliente();
            }catch(NullPointerException e){
                JOptionPane.showMessageDialog(null, e.getMessage());
            }

Sim neste caso está correto, você está usando o try, catch para tratar eventual problema que o metodo verificaExistenciaCliente possa levantar.

Só não entendi uma coisa… resolveu sua duvida? ou tem alguma coisa que não entendeu?

Att

Bom, ainda tneho uma dúvida,
no caso se eu tivesse vários ifs com text field que pudessem lançar null pointer exception, seria assim?

       String campoBusca = tfBusca.getText();  
      String campoBusca1 = tfBusca.getText();  
       if (campoBusca.isEmpty()) {  
           throw new NullPointerException("Campo Vazio");  
       } else {
       if (campoBusca1.isEmpty()) {  
           throw new NullPointerException("Campo inválido");  
       } 
       //...
}  

Está certo ou errado?
se estiver certo, cm que eu trataria isso?
se estiver errado, cm é o certo?

vasco.fred

Não tem muito o que é certo, o que é errado.
Existem varias formas de se fazer isto, você pode criar uma classe de erro (negocio), ou pode tratar da forma que está fazendo, etc etc.

O que você precisa primeiro ver é como você quer tratar os erros? se eu tiver por exemplo os dois campos sem preencher… você quer mostrar este erro de uma unica vez?

  • Campo X Vazio
  • Campo Y Inválido

Pretende logar estes erros, enviar para algum lugar, etc etc.

Etc, etc… !!! o que você precisa primeiro analisar é a forma que seu projeto vai trabalhar… !!! Se possível de uma lida sobre exceções… checked, unchecked… pesquise tambem benefícios e problemas de se criar sua propria classe de erro, etc.

A princípio não vejo uma receita de bolo e sim um estudo sobre o comportamento que você espera e tenta imaginar a forma que é boa de captar e mostrar este erro. Por isto acho interessante você pesquisar a respeito.

Att

Entendi um pouco, vou ler sobre isso.
Porém, gostaria que vc me dissesse como se comportar perante esse problema
o textField nome não pode ser vazio, e o textField Numero não pode ser letra, e ele lança uma exceção que ta comentado,
nao consigo imaginar, como fazer isso, levando em consideração aquele if que vc fez no outro exemplo
cm proceder?

 cliente.setNome(tfNome.getText());
e.setRua(tfEndereco.getText());
e.setNumero(Integer.parseInt(tfNumero.getText()));// numberFormatException
e.setComplemento(tfComplemento.getText());
e.setBairro(tfBairro.getText());
e.setCep(tfCep.getText());//
e.setReferencia(tfReferencia.getText());
cliente.setTelFixo(tfTelFixo.getText());
cliente.setTelCelular(tfTelCelular.getText());

Bom até onde vi, este código que você postou é referente a outro problema… mas vamos la.

O que você pode fazer é criar a mesma ideia que usamos naquele outro problema

[code] public void metodo() throws NumberFormatException {
cliente.setNome(tfNome.getText());
e.setRua(tfEndereco.getText());

	try {
		e.setNumero(Integer.parseInt(tfNumero.getText()));
	} catch (NumberFormatException nfe) {
		throw new NumberFormatException("Campo número com formato inválido.");
	}
	// ....Outras atribuições aqui
}[/code]

Eu particularmente não gosto muito disto, porque o código vai ficar muito bagunçado, o que você pode fazer é criar um metodo private que trate as validações antes de chamar o método para persistir, atualizar, etc.

Mas como disse é importante você entender isto, pois não vejo isto como um problema de sintaxe ou algo do genero, é mais algo estrutural da sua aplicação, como as coisas vão ser modeladas e tratadas para evitar o mínimo esforço para tratar as exceções etc.

Att

Ok astork,
Mt obg mais uma vez pelas informações
entendi perfeitamente.
Irei dar uma estudada sobre exceção
Abraços.

Legal, vasco.fred

É isto ai, acho que agora já consegue ter uma noção do pesquisar e com isto aprender montar algo legal sobre erros/logs… !!!
Se tiver dúvidas sobre exception http://download.oracle.com/javase/tutorial/essential/exceptions/ é um bom inicio para ser lido.

E surgindo duvidas referente a modelagem ou estrutura, é legal postar aqui para discutirmos.

Bom estudos.
Att

é pq no meu caso são varias exceções, por isso que eu não entendo.
primeiro os campos nome, bairro e endereço não podem ser nulos, caso nao sejam nulos, eles não podem ser números;
os campos numeros e cep não podem ser char/string;
É isso que eu me confundo, como integrar várias exceções entendeu?


if((tfNome.getText().equals("")) || (tfBairro.getText().equals("")) || (tfEndereco.getText().equals(""))){
             JOptionPane.showMessageDialog(null, "Preencha os campos obrigatórios");
         }
         else{
             System.out.println(tfNome.getText());
             Cliente cliente = new Cliente();
             Endereco e = new Endereco();

             cliente.setNome(tfNome.getText());
             e.setRua(tfEndereco.getText());
             e.setNumero(Integer.parseInt(tfNumero.getText()));//
             e.setComplemento(tfComplemento.getText());
             e.setBairro(tfBairro.getText());
             e.setCep(tfCep.getText());//
             e.setReferencia(tfReferencia.getText());
             cliente.setTelFixo(tfTelFixo.getText());
             cliente.setTelCelular(tfTelCelular.getText());

             banco = new BancoDeDados();
             banco.incluirUsuario(cliente, e);
             JOptionPane.showMessageDialog(null, "Cadastro efetuado com sucesso");
             //banco.listarUsuarios();
             banco.desconectar();
             this.dispose();

Alguém?

vasco.fred

Você já pensou como você quer isto? Não tem muito o que fazer, se são varias exceções, você vai precisar tratar uma a uma !!!
Novamente segue algumas soluções que você pode fazer

  1. Fazer um validador que vai alimentando uma lista de erros List e depois que terminar de validar tudo, sua aplicação verifica se existem erros, se tiver mostra para o usuário
    O Cadastro tem as seguintes consistencia
  • Campo nome precisa ser preenchido.
  • Cep só aceita numeros
    bla bla bla
  1. Caso preferir (embora não acho bom), você pode validar e quando der erro já apresenta para o usuário, porém isto é ruim, pois a pessoa vai ter que colocar salvar varias vezes até todos os erros finalizarem.

Tem um link que achei interessante, onde é ensinado como criar um validador.
http://www.javabuilding.com/workshop/criando-sua-api-de-validacao.html

Mas veja… primeira coisa você precisa decidir o que quer validar e quando mostrar para o usuário, se é tudo junto, separado, etc… !! E assim modelar !!!

Att

Só mais um detalhe, você pode pesquisar algum framework que já tenha uma solução mais facil a respeito disso.
Particularmente eu nunca usei !!!

Att