• Nenhum resultado encontrado

Aula14-PráticacomTratamentodeErros

N/A
N/A
Protected

Academic year: 2021

Share "Aula14-PráticacomTratamentodeErros"

Copied!
24
0
0

Texto

(1)

Linguagem de Programação II

Aula 14 – Prática com Tratamento de Erros

Prof. Nemésio Freitas Duarte Filho

(2)

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

(3)

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

(4)

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

(5)

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

(6)

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?

(7)

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

(8)

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?

(9)

Para aprendermos os conceitos básicos das

exceptions do Java, teste o seguinte código

(10)

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");

}

}

(11)

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");

}

}

(12)

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

}

}

(13)

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

(14)

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.

(15)

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

} }

(16)
(17)

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

} }

(18)

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.

(19)

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");

}

}

}

(20)
(21)

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");

} } }

(22)
(23)

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!"); }

} }

(24)

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();

} }

Referências

Documentos relacionados

Para se poder constatar as diferenças no comportamento dos elementos metálicos estruturais, sujeitos ao carregamento cíclico, foram incorporados níveis de esforço axial constantes

Este trabalho buscou, através de pesquisa de campo, estudar o efeito de diferentes alternativas de adubações de cobertura, quanto ao tipo de adubo e época de

A prova do ENADE/2011, aplicada aos estudantes da Área de Tecnologia em Redes de Computadores, com duração total de 4 horas, apresentou questões discursivas e de múltipla

Foram consideradas como infecção relacionada ao CVC os pacientes que apresentavam sinais locais de infecção (secreção purulenta e/ou hiperemia) e/ou hemocultura

a viver na felicidade completa. Vós, Deus de ternura e de bondade, nunca vos cansais de perdoar.. Concedeis agora a vosso povo tempo de graça e reconciliação. Daí, pois, em

Os estudos originais encontrados entre janeiro de 2007 e dezembro de 2017 foram selecionados de acordo com os seguintes critérios de inclusão: obtenção de valores de

A seleção portuguesa feminina de andebol de sub-20 perdeu hoje 21-20 com a Hungria, na terceira jornada do Grupo C do Mundial da categoria, a decorrer em Koprivnica, na

INDICADORES AMBIENTAIS ESSENCIAIS: UMA ANÁLISE DA SUA UTILIZAÇÃO NOS RELATÓRIOS DE SUSTENTABILIDADE DAS EMPRESAS DO SETOR DE ENERGIA ELÉTRICA SUL AMERICANO, ELABORADOS