Exceptions - Criando novas Exceptions

Boa tarde

Minha dúvida não é nem tanto com código é mais conceitual mesmo. Provavelmente quem trabalha na área irá me responder facil facil. Bom eu estou começando a fazer meu programa e quero já fazer as possíveis exceções que podem ocorrer como:
:arrow: campo nulo
:arrow: digito inválido e outros

Eu gostaria de colocar todas as Exceptions em uma unica classe e invocar a classe sempre que ocorrer o erro e apresentar as mensagens.

Agora as dúvidas:

No caso eu quero montar uma classe com todas as exceptions, como eu poderia fazer isso? Digo por código eu chamaria as mensagens? Alguem teria um modelo só pra eu ter uma base de como montar.
Obs.: Não quero copiar, eu quero fazer da melhor forma possível pq sei que isso vou usar muito.

Por exemplo, eu digito um nome inválido ou digito algo que não é válido para aquele parametro. Eu sei que com um simples loop eu consigo validar o campo até estar correto, mas isso é correto, ou qualquer erro sem excessão deve ser tratado no try catch :?:

Desde já agradeço quem me ajudar!!!

Você pode fazer uma classe ValidationException (que herda de Exception) e criar subclasses a partir dessa classe ValidationException (como InvalidDigitException, EmptyFieldException etc.) que refinam o tipo de validação exigido, se você quiser checar isso.

PS:Para campo nul já existe o NullPointerException
para campo invalido o IllegalArgumentException

Entretanto você pode fazer algo assim

Exemplo

  public class MinhaExpetion extends Exception{
    private String msg;
    public MinhaExpetion(String msg){
      super(msg);
      this.msg = msg;
    }
    public String getMessage(){
      return msg;
    }
  }

  public class ArgumentoInvalidoException extends MinhaException{
    public ArgumentoInvalidoException(){
      super("Argumento invalido");
    }
  }

  public class ArgumentoNuloException extends MinhaException{
    public ArgumentoInvalidoException(){
      super("Argumento nulo");
    }
  }

public class Testa{
 public static void main(String[] args){
  try{
   if(args[0] == null)
    throw new ArgumentoInvalidoException();

   String numero = javax.swing.JOptionPane.showInputMessage(null,"Digite um numero entre 0 e 10");
   Integer inteiro = Integer.parseInt(numero);
   if(inteiro > 10 || inteiro < 0)
    throw new ArgumentoInvalidoException();
   }catch(MinhaException me){
     System.err.println(me.getMessage());
   }
  }
}
1 curtida

Mark Ameba mas assim eu nao entendi algumas coisas agora:

public class MinhaExpetion extends Exception{ private String msg; public MinhaExpetion(String msg){ super(msg); // pq vc chama o super(msg)? this.msg = msg; } public String getMessage(){ // aqui vc está sobrescrevendo o metodo getMessage do super? return msg; } }
Não era mais facil vc pegar a mensagem (msg) recebida e simplesmente imprimir :?:

[quote=henry.everton]Mark Ameba mas assim eu nao entendi algumas coisas agora:

public class MinhaExpetion extends Exception{ private String msg; public MinhaExpetion(String msg){ super(msg); // pq vc chama o super(msg)?//Quando escrevi essa parte não tava pensando em sobreescrever o método getMessage da super class this.msg = msg; } public String getMessage(){ // aqui vc está sobrescrevendo o metodo getMessage do super? return msg; } }
[/quote]

[quote=henry.everton]
Não era mais facil vc pegar a mensagem (msg) recebida e simplesmente imprimir :?:[/quote]

Você quis dizer algo assim?

public class MinhaExpetion extends Exception{ public MinhaExpetion(String msg){ System.err.println(msg); } }
?

Veja um exemplo diferente

 public class MinhaExpetion extends Exception{ 
    private String msg;
    public int contador;
    public MinhaExpetion(String msg){
      super(msg);
      this.msg = msg;
    } 
  } 


 public class Teste{
   public static void main(String...args){
    try{
     comecaLoop();
    }catch(MinhaException e){
     System.err.println("Essa exceção foi lançada "+e.contador+" vezes");
    }
   }
   public static void comecaLoop() throws MinhaException{
    try{
     for(int i = 0; i < 10;i++)
       for(int j = 0; j < 10;j++)
        if(i > j)
         throw new MinhaException();
        else
          comecaLoop();
    }catch(MinhaException me){
    me.contador++;
    throw me;
    }
   }
 }

exatamente!!!
Agora assim… tem alguma vantangem em fazer da forma anterior ou não?

Qual geraria um maior problema para manutenção do sistema caso tenha?

Acho que seria mais problemática lançar apenas lançar e dar um System.out.println toda hora que tiver uma nova exceção que no caso do meu exemplo poderia lançar muitas vezes, mesmo que seria melhor você mecher com variaveis na Exception para facilitar oque você espera.

[quote=henry.everton]Boa tarde

Minha dúvida não é nem tanto com código é mais conceitual mesmo. Provavelmente quem trabalha na área irá me responder facil facil. Bom eu estou começando a fazer meu programa e quero já fazer as possíveis exceções que podem ocorrer como:
:arrow: campo nulo
:arrow: digito inválido e outros

Eu gostaria de colocar todas as Exceptions em uma unica classe e invocar a classe sempre que ocorrer o erro e apresentar as mensagens.
[/quote]

“Exceptions não devem ser usadas para controle de fluxo. (Não são Ifs)”

Ao emitir uma exception quando um campo é inválido vc está violando a diretiva anterior. Não use exeptions para validar telas. Aliás não as use para validação.

Agora, se vc tem um método XYZ que recebe parametros e vc quer manter a consistencia vigiando os parametros ai sim vale usar exceptions.

“Não crie Exceptions quando já existe alguma que transmite a mesma mensagem”
Antes de criar uma classe de exception investigue se não existe uma que faça o mesmo. O NullPointerException e o IllegalArgumentException e o UnsupportedOperationException são muito uteis nesses casos. Existem muitas outras.

Sergio

Agora vc me deixou na dúvida, tipo eu nao posso fazer válidação com do campo com exception?
tipo IllegalArgumentException é pra quando ele digita algo não válido para o campo (ex: o campo é inteiro e ele digita String).
A exception nao pode ser utilizada para este tipo de programaação aqui:

[code]public class Teste{

public int idade;

public setIdade(int idade){
if(idade<0 || idade>100){
aqui eu chamaria uma exceção ex: IllegalArgumentException();
}
else{
this.idade=idade;
}[/code]

Isso não pode ser feito ou exceção seria somente e somente para erros do programa em si?

[quote=henry.everton]Sergio

Agora vc me deixou na dúvida, tipo eu nao posso fazer válidação com do campo com exception?
tipo IllegalArgumentException é pra quando ele digita algo não válido para o campo (ex: o campo é inteiro e ele digita String).
A exception nao pode ser utilizada para este tipo de programaação aqui:

[code]public class Teste{

public int idade;

public setIdade(int idade){
if(idade<0 || idade>100){
aqui eu chamaria uma exceção ex: IllegalArgumentException();
}
else{
this.idade=idade;
}[/code]

Isso não pode ser feito ou exceção seria somente e somente para erros do programa em si?[/quote]

O codigo que mostra não tem nenhum problema. Pode usar o IllegalArgumentException. Só passe uma mensagem dizendo qual campo é illegal e porquê.

Agora pense : quem vai invocar esse método ? A UI ? A camada de negocios ? os dois ?
Idade não é um campo, é um atributo. Quando vc falou de campos no post inicial eu entendi que estava falando de campos na UI. Se vc está pensando em usar IllegalArgumentException para mostrar na tela que o campo está errado, isso é usar IllegalArgumentException para controle de fluxo. Isso é um erro.
Se vc vai usar isso internamente no programa na camada de negocios para que nenhum programador idiota faça asneira ai tudo bem.

Se você deseja tratar exceptions de forma personalizada, crie uma classe que extenda exception. Nesta nova classe, implemente os métodos de sejados, assim como os blocos try catch para tratamento de exceptions.

public Classs MyException extends Exception{

public void trataErroSQL(){
// código referente ao tratamento de erro
}

public void trataErroFileIO(){
// código referente ao tratamento de erro
}

}

}

Tenho esse try, queria saber como que faço pra tratar um eventual erro, usando a Exception, mas quando houver esse erro o cursor voltar para codAlunofield(jtextField) pra o usuario digite novamente!! Alguem pode me ajudar???

try {
queryAluno = entityManager.createNamedQuery(“Aluno.findByCodaluno”);
queryAluno.setParameter(“codaluno”, Integer.parseInt(codAlunofield.getText()));
listAluno = queryAluno.getResultList();
nomeAlunoField.setText(listAluno.get(0).getNome());
cpfAlunoField.setText(listAluno.get(0).getCpf());
} catch ( Exception e) {
JOptionPane.showMessageDialog(null, “Ocorreu um erro, use apenas numeros!”);
e.printStackTrace();
codAlunofield.requestFocus();

         }