Linguagem de Programação II
Aula 14 – Prática com Tratamento de Erros
Prof. Nemésio Freitas Duarte Filho
Ementa
Introdução ao JAVA
Introdução e Fundamentos de POO
Classes, Objetos, Atributos e Métodos
Encapsulamento, Herança e Polimorfismo
Interfaces gráficas
Tratando erros
Pacotes - Organizando suas classes e bibliotecas
Ementa
Introdução ao JAVA
Introdução e Fundamentos de POO
Classes, Objetos, Atributos e Métodos
Encapsulamento, Herança e Polimorfismo
Interfaces gráficas
Tratando erros
Pacotes - Organizando suas classes e bibliotecas
Para aprendermos os conceitos básicos das
exceptions do Java, teste o seguinte código
public class Erros {
/**
* @param args the command line arguments */
public static void main(String[] args) { System.out.println("inicio do main"); metodo1();
System.out.println("fim do main"); }
static void metodo1() {
System.out.println("inicio do metodo1"); metodo2();
System.out.println("fim do metodo1"); }
static void metodo2() {
System.out.println("inicio do metodo2"); int[] array = new int[10];
for (int i = 0; i <= 15; i++) { array[i] = i; System.out.println(i); } System.out.println("fim do metodo2"); } }
Para aprendermos os conceitos básicos das
exceptions do Java, teste o seguinte código
Repare o método main chamando metodo1 e esse, por sua vez, chamando o metodo2. Cada um desses
métodos pode ter suas próprias variáveis locais, sendo que, por exemplo, o metodo1 não enxerga as variáveis
declaradas dentro do main.
Como o Java (e muitas das outras linguagens) faz isso? Toda invocação de método é empilhada... em uma
estrutura de dados que isola a área de memória de cada um. Quando um método termina (retorna), ele volta
para o método que o invocou. Ele descobre isso através da pilha de execução (stack). Basta jogar fora um
Para aprendermos os conceitos básicos das
exceptions do Java, teste o seguinte código
Porém, o nosso metodo2 propositadamente possui um enorme problema: está
acessando um índice de array indevido para esse caso; o índice estará fora dos limites da array quando chegar em 10! Rode o código. Qual é a saída? O que isso representa? O que ela indica?
Para aprendermos os conceitos básicos das
exceptions do Java, teste o seguinte código
Essa é o conhecido rastro da pilha (stacktrace). É uma saída importantíssima
para o programador – tanto que, em qualquer fórum ou lista de discussão, é
comum os programadores enviarem, juntamente com a descrição do problema, essa stacktrace.
Por que isso aconteceu? O sistema de exceções do Java funciona da seguinte maneira:
quando uma exceção é lançada (throws), a JVM entra em estado de alerta e vai
ver se o método atual toma alguma precaução ao tentar executar esse trecho de código.
Como podemos ver, o metodo2 não toma nenhuma medida diferente do que
vimos até agora.
Como o metodo2 não está tratando esse problema, a JVM finaliza a execução dele
anormalmente, sem esperar ele terminar, e volta um stackframe pra baixo, onde será feita nova verificação: o metodo1 está se precavendo de um problema chamado
ArrayIndexOutOfBoundsException?
Não... volta para o main, onde também não há proteção, então a JVM, a aplicação
Para aprendermos os conceitos básicos das
exceptions do Java, teste o seguinte código
E Obviamente, aqui estamos forçando esse caso, e não faria sentido tomarmos
cuidado com ele. É fácil arrumar um problema desses: basta percorrermos a array no máximo até o seu length.
Porém, apenas para entender o controle de fluxo de uma Exception, vamos colocar o
código que vai tentar (try) executar o bloco perigoso e, caso o problema seja do tipo ArrayIndexOutOfBoundsException, ele será pego (catched). Repare que é
interessante que cada exceção no Java tenha um tipo... ela pode ter atributos e métodos.
2) Adicione um try/catch em volta do for, pegando ArrayIndexOutOfBoundsException. O que o código imprime?
Para aprendermos os conceitos básicos das
exceptions do Java, teste o seguinte código
Para aprendermos os conceitos básicos das
exceptions do Java, teste o seguinte código
Em vez de fazer o try em torno do for inteiro, tente apenas com o bloco de dentro da
main.
public static void main(String[] args) {
try {
System.out.println("inicio do main");
metodo1();
System.out.println("fim do main");
} catch (ArrayIndexOutOfBoundsException e) {
System.out.println("erro: " + e);
System.out.println("erro tratado");
}
}
Para aprendermos os conceitos básicos das
exceptions do Java, teste o seguinte código
Em vez de fazer o try em torno do for inteiro, tente apenas com o bloco de dentro da
main.
public static void main(String[] args) {
try {
System.out.println("inicio do main");
metodo1();
System.out.println("fim do main");
} catch (ArrayIndexOutOfBoundsException e) {
System.out.println("erro: " + e);
System.out.println("erro tratado");
}
}
Exceções de Runtime mais comuns
Que tal tentar dividir um número por zero? Será que a JVM
consegue fazer aquilo que nós definimos que não existe?
public class TestandoADivisao {
public static void main(String args[]) {
int i = 5571;
i = i / 0;
System.out.println("O resultado " + i);
}
}
Exceções de Runtime mais comuns
Efetuando um tratamento!
public static void main(String[] args) {
try {
int i = 5571; i = i / 0;
System.out.println("O resultado " + i);
} catch (ArithmeticException e) { System.out.println("erro: " + e); System.out.println("erro tratado"); } } }
ArrayIndexOutOfBoundsException
ArrayIndexOutOfBoundsException: Este tipo de exceção acontece
quando há a tentativa de recuperar o conteúdo de uma posição de um
array utilizando um indexador maior que a última posição (índice) do array.
ArrayIndexOutOfBoundsException
public class TesteException1{ public class TesteException1{
public static void main (String args[]){
int vetor[] = {3,6,9}; int index = 4;
try{
System.out.println("A terceira posicao é: " + vetor[index]); }
catch (ArrayIndexOutOfBoundsException e){
System.out.println("A posicao " + index + " não é valida"); }
} }
StringIndexOutOfBoundsException
import javax.swing.JOptionPane;public class TesteException2{
public static void main (String args[]){ String str;
String mensagem = "Digite a informacao"; int icone = JOptionPane.INFORMATION_MESSAGE; try{
str = JOptionPane.showInputDialog(null, mensagem, "msg", icone); char c = str.charAt(0);
}
catch (StringIndexOutOfBoundsException e){
System.out.println("A variavel str está nula (null) "); }
} }
NumberFormatException
NumberFormatException: Este tipo de exceção acontece quando
tentamos converter uma string para um tipo primitivo numérico,
porém a string não contém apenas caracteres numéricos.
NumberFormatException
public class TesteException4{
public static void main (String args[]){
String str = "12x";
try{
int num = Integer.parseInt(str);
}
catch (NumberFormatException e){
System.out.println("Numero " + str + "
inválido");
}
}
}
Bloco finally
public class TesteException5{
public static void main (String args[]){ int vetor[] = {3,6,9};
int index = 4; try{
System.out.println("A terceira posicao é: " + vetor[index]); }
catch (ArrayIndexOutOfBoundsException e){
System.out.println("A posicao " + index + " não é valida"); }
finally{
System.out.println("Execução independente de ser gerada uma exceção ou não");
} } }
Diversos catch Para Tratar Erros Diversos em um Único Bloco de Código
public class TesteTryCatch{
public static void main (String args[]){ try{
String str1 = args[0]; String str2 = args[1];
int num1 = Integer.parseInt(str1); int num2 = Integer.parseInt(str2);
double resp = num1 / num2;
System.out.println("O resultado é: " + resp); }
catch (ArrayIndexOutOfBoundsException e){
System.out.println("Devem ser informados 2 argumentos"); }
catch (NumberFormatException e){
System.out.println("Erro na conversão de string para inteiro"); }
catch (ArithmeticException e){
System.out.println("Ocorreu uma divisão por zero!"); }
} }
Criando Exceções
public class Erros {
public void VerificaDados() throws NumberFormatException { try { boolean dados; dados = false; if (!dados) {
throw new NumberFormatException("Dados falsos"); }
} catch(NumberFormatException e){
System.out.println("Erro encontrado:" + e.getMessage()); }
}
public static void main(String args[]){
Erros obj = new Erros(); obj.VerificaDados();
} }