Pessoal, estou tentando fazer uma calculadora com interface gráfica bem simples, só com as 4 principais operações mesmo. E queria colocar um tratamento de exceção caso tente realizar uma divisão por zero.
Vou colocar alguns trechos das minhas classes, para não ficar muito grande.
public class Calculadora extends JanelaGrafica {
private float op1, op2, result;
private int cont;
private char operador;
private Calculadora Atual; // Só para mandar o objeto atual para o tratamento de exceção
public Calculadora()throws DivPorZero{
//Construtor da classe JanelaGrafica, para criar a janela da calculadora.
super();
/* Contador para saber se já foi digitado um operador, para que seja possível
* saber a ordem dos operadores (das variáveis).
*/
cont = 0;
Atual = this;
operandos[0].addActionListener(new ActionListener(){
public void actionPerformed(ActionEvent e){
//Se for o primeiro operador da conta
if(cont==0){
op1 = Float.parseFloat(topo.getText());
topo.setText(null); //Apagar o TextField da calculadora, para receber o novo operando.
cont++; //Indicar que já foi digitado um operador.
operador = '/';
}
}
});
operandos[1].addActionListener(new ActionListener(){
public void actionPerformed(ActionEvent e){
if(cont==0){
op1 = Float.parseFloat(topo.getText());
topo.setText(null);
cont++;
operador = '*';
}
}
});
operandos[2].addActionListener(new ActionListener(){
public void actionPerformed(ActionEvent e){
if(cont==0){
op1 = Float.parseFloat(topo.getText());
topo.setText(null);
cont++;
operador = '+';
}
}
});
operandos[3].addActionListener(new ActionListener(){
public void actionPerformed(ActionEvent e){
if(cont==0){
op1 = Float.parseFloat(topo.getText());
topo.setText(null);
cont++;
operador = '-';
}
}
});
operandos[5].addActionListener(new ActionListener(){
public void actionPerformed(ActionEvent e){
cont = 0;
topo.setText(null);
}
});
operandos[4].addActionListener(new ActionListener(){
public void actionPerformed(ActionEvent e){
switch(operador){
case '/':
if(cont==1){
op2 = Float.parseFloat(topo.getText());
topo.setText(null);
String aux;
result = op1 / op2;
aux = Float.toString(result);
topo.setText(aux);
cont--;
}
else{
throw new DivPorZero(Atual);
//topo.setText(null);
}.......[/code]
Classe DivPorZero
public class DivPorZero extends Exception{
public DivPorZero(Calculadora calc){
calc.topo.setText("Erro. Não existe divisão por 0.");
}
}
O erro que aparece é o seguinte:
[color=red]Exception in thread “main” java.lang.Error: Unresolved compilation problem:
Unhandled exception type DivPorZero
at AplicacaoGrafia.main(AplicacaoGrafia.java:6)
[/color]
A calculadora está realizando as operações normalmente, só que na hora que mando fazer uma div por 0, só aparece a palavra “Infinity” no TextField, e eu queria mudar isso com o tratamento de exceções.
antes de mais nada, uma exceção serve só para ser exceção, nada de atribuir valores a campos a partir de uma exceção.
Segundo, crie um contrutor default (construtor que não recebe nada) e outro que recebe uma string (para você mostrar mensagens para o usuário) e tente de novo!
divisões por zero já lançam java.lang.ArithmeticException , se quiser pode trabalhar com elas ou até lançar a sua exceção ao capturar uma ArithmeticException
[quote=Thiago veiga]divisões por zero já lançam java.lang.ArithmeticException , se quiser pode trabalhar com elas ou até lançar a sua exceção ao capturar uma ArithmeticException
[/quote]
Mas como eu chamo ela ?
Desculpe as tantas perguntas, é que ainda estou aprendendo java.
[code]case ‘/’:
try{
if(cont==1){
op2 = Float.parseFloat(topo.getText());
topo.setText(null);
String aux;
result = op1 / op2;
aux = Float.toString(result);
topo.setText(aux);
cont–;
}
}
catch(throw new DivPorZero(Atual)){
DivPorZero(e1);
}
break;[/code]
Eu coloquei assim, mas ta dando erro. Eu até consegui imprimir na calculadora a minha mensagem mas foi utilizando uma sugestão do próprio Eclipse, mas achei que ficou estranho… olha só:
nao sei se é bem o que vc quer , mas fiz um pequeno exemplo
classe de teste
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.JTextField;
public class TestError extends JFrame{
public TestError() {
super("my window");
}
public static void main(String[] args) {
TestError testError = new TestError();
JPanel painel = new JPanel();
JTextField text = new JTextField();
painel.add(text);
testError.add(painel);
testError.setBounds(200, 200, 200, 200);
testError.setVisible(true);
try{
throw new MyException("mensagem de erro");
}catch(MyException me){
text.setText(me.getMessage());
}
}
}
minha classe de erro
public class MyException extends Exception{
public MyException() {
this("meu erro");
}
public MyException(String erro){
super(erro);
}
}
como foi dito acima , faça um construtor default e um que recebe uma string na classe de erro e esta classe de exceção serve só para ser exceção, nada de atribuir valores a campos a partir de uma exceção.