Tratando exceções: JAVA

O tratamento de exceções em JAVA é tão e, geralmente, mais importante que em outras linguagens de programação. Isso pode ser afirmado a partir do momento em que lembramos que no JAVA, alguns métodos, de algumas classes, simplesmente não são “entendidos” pela JVM se não estiverem sendo utilizados racionalmente pelo programador dentro de blocos try->catch->finally. Assim como há situações nas quais o erro não deve ser tratado, o que é indicado pela classe java.lang.Error e suas derivadas.

Dois destes exemplos são os métodos read() e readLine(), utilizados geralmente em conjunto com o objeto System.in com o intuito de se efetuar a leitura do dispositivo padrão de entrada, o teclado (quase sempre uma técnica utilizada em programas texto em JAVA). Caso um dos métodos seja invocado fora de um bloco try, o JAVA simplesmente não gera o bytecode do fonte e apresenta um erro semelhante à este (no cenário descrito aqui):

ConvInt.java:6: Exception java.io.IOException must be caught, or it must be declared in the throws clause of this method.

System.in.read(tB);
^
1 error

Segundo este excelente material introdutório sobre JAVA, mantido pela UNICAMP, a sinalização da exceção é propagada a partir do bloco de código onde ela ocorreu através de toda a pilha de invocações de métodos até que a exceção seja capturada por um bloco manipulador de exceção. Eventualmente, se tal bloco não existir em nenhum ponto da pilha de invocações de métodos, a sinalização da exceção atinge o método main(), fazendo com que o interpretador Java apresente uma mensagem de erro e aborte sua execução.

A captura e o tratamento de exceções em Java se dá através da especificação de blocos try, catch e finally, definidos através destas mesmas palavras reservadas da linguagem. Um comando try/catch/finally obedece à seguinte sintaxe:

try {
// código que inclui comandos/invocações de métodos
// que podem gerar uma situação de exceção.
}
catch (XException x) {
// bloco de tratamento associado à condição de
// exceção XException ou a qualquer uma de suas
// subclasses, identificada aqui pelo objeto
// com referência x
}
catch (YException y) {
// bloco de tratamento para a situação de exceção
// YException ou a qualquer uma de suas subclasses
}
finally {
// bloco de código que sempre será executado após
// o bloco try, independentemente de sua conclusão
// ter ocorrido normalmente ou ter sido interrompida
}

Os blocos não podem ser separados por outros comandos — um erro de sintaxe seria detectado pelo compilador Java neste caso. Cada bloco try pode ser seguido por zero ou mais blocos catch, onde cada bloco catch refere-se a uma única exceção.

O bloco finally é sempre executado. Em geral, ele inclui comandos que liberam recursos que eventualmente possam ter sido alocados durante o processamento do bloco try e que podem ser liberados, independentemente de a execução ter encerrado com sucesso ou ter sido interrompida por uma condição de exceção. A presença desse bloco é opcional.

Aproveitando esta abordagem, divulgo aqui no JACK.eti.br, um exemplo de aplicação, for texto, em JAVA (J2DK-SE), capaz de efetuar leitura diretamente do buffer do teclado (vários caracteres). Trata-se de um exemplo abordado durante a introdução ao assunto, junto à 2ª Fase do Curso de Sistemas de Informação da UnC-Concórdia, na disciplina de Laboratório de Programação I. Se preferir, você também pode fazer o download do código-fonte.

Para executar a aplicação, você precisa ao menos ter a JRE instalada no seu sistema operacional, compilar o código e, em seguida, invocar a JVM para fazer a interpretação do bytecode:

javac venda.java

java venda

//início do código fonte em java

//aplicativo “venda”

//desenvolvido pelos alunos da 2ª Fase do Curso de SI – UnC/Cdia

import java.io.*;

public class venda{
int codpeca, quant;
String descpeca, cliente, vendedor;
float valuntpeca, totvenda, comissao;
public static void main(String[]args){
BufferedReader teclado = new BufferedReader(new InputStreamReader(System.in));
venda v1 = new venda();
try {
System.out.println(“Informe o codigo da peca”);
v1.codpeca=Integer.parseInt(teclado.readLine());
System.out.println(“Informe a descricao da peca”);
v1.descpeca=teclado.readLine();
System.out.println(“Informe a quantidade recebida”);
v1.quant=Integer.parseInt(teclado.readLine());
System.out.println(“Informe o valor unitario da peca”);
v1.valuntpeca=Float.parseFloat(teclado.readLine());
System.out.println(“Informe o nome do cliente”);
v1.cliente=teclado.readLine();
System.out.println(“Informe o vendedor”);
v1.vendedor=teclado.readLine();
} catch (IOException ioe) {
System.out.println (“Erro na leitura do buffer do teclado… Verifique!”);
System.exit(1);
}
v1.totvenda=v1.quant*v1.valuntpeca;
v1.comissao=((v1.totvenda*7)/100);
System.out.println(“Cliente: “+v1.cliente);
System.out.println(“Vendedor “+v1.vendedor);
System.out.println(“Peca “+v1.descpeca);
System.out.println(“Total da Venda “+v1.totvenda);
System.out.println(“Comissao “+v1.comissao);
}
}