Tratamento de Exceção não é reconhecido

9 respostas
Mus4shi

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.

Classe Calculadora
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;

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

Muito Obrigado.

9 Respostas

thiago.correa

oops vide tópico abaixo!

thiago.correa

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!

Mus4shi

Mas se eu não recebo a calculadora como parâmetro, como eu vou alterar o TextField dela, na Exceção?

T

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

Mus4shi

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

Mas como eu chamo ela ?

Desculpe as tantas perguntas, é que ainda estou aprendendo java.

Valew

T
try {
  // seu codigo 
}catch(ArithmeticException)
{
 // tratamento de erro 
}

se quiser chamar a sua exceção onde esta o tratamento de erro coloque throw new DivPorZero( seu objeto );

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

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ó:

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--;
					}
					}
					finally{
						try {
							throw new DivPorZero(Atual);
						} catch (DivPorZero e1) {
							// TODO Auto-generated catch block
							e1.printStackTrace();
						}
						//topo.setText(null);		
					}
					
					break;

Ele imprime mas da um monte de erro no Eclipse.

T

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.

Mus4shi

Eu fiz assim e está dando certo… agora não sei se é correto fazer isso:

case '/': if(cont==1){ try{ op2 = Float.parseFloat(topo.getText()); topo.setText(null); String aux; result = op1 / op2; aux = Float.toString(result); topo.setText(aux); cont--; if(op2 == 0) throw new DivPorZero(Atual); }catch (DivPorZero e1){} }

Valew pelas dicas pessoal, agora vou tentar colocar um tratamento de evento para teclado. :smiley:

Criado 20 de novembro de 2008
Ultima resposta 20 de nov. de 2008
Respostas 9
Participantes 3