Exceções, Loops e Recursão Guilherme Carvalho (gvc)
Instruções para a aula Façam silêncio. Se tiverem dúvidas, perguntem a mim. Se tiverem vergonha, levantem a mão e me
chamem. Evitem ter vergonha, sua dúvida pode ser a
do seu colega. Participem. Se tiverem dúvidas, perguntem a mim. Façam silêncio. Participem. E se lembrem de tirar dúvidas comigo. COMIGO! Beleza?
O que temos pela frente Exceções
Motivação Criando Tratando
Memory Leak Como o Garbage Collector funciona!
Loops while for do-while for
Recursão Miniprova
Situações excepcionais O que são situações excepcionais?
“É um evento que ocorre durante a execução de um programa que interrompe o fluxo normal das instruções”
Definição da Sun
4
Erros em Java Quando acontece uma situação excepcional
na execução de um programa Java, como é feita a notificação?
7
Erros em Java A Api de Java define uma classe Throwable,
que define todos os erros e exceções. Da classe Throwable, foram criadas as classes
Exception e Error.
8
A família Error A classe Error serve para representar
condições anormais, que não deveriam ocorrer nunca.
Programas não devem tratar Errors. Exemplo:
OutOfMemoryErrorSe você tentar alocar 2147483648 inteiros.
9
A família Exception A classe Exception representa os erros que
um programa deve tratar. A partir da classe Exception foi criado mais
um subtipo: RuntimeException.
10
A família RuntimeException São exceções não checadas.
Mais disso daqui a alguns slides. Vocês conhecem sua filha mais famosa!
NullPointerException E a filha menos famosa:
ArithmeticException
11
Exceções As exceções predefinidas de Java não servem
para todas as situações. Nós, programadores, queremos criar nossas
próprias exceções. A que família nossas exceções pertencem?
12
Criando exceções
13
Uma exceção é uma classe como outra qualquer, vocês já sabem criar uma!
Devem extender Exception. Para facilitar a legibilidade, e seguir os
padrões, seus nomes devem acabar com Exception.
Dois exemplos:
Criando exceções
14
public class DeuPauException extends Exception {
/*
Corpo da exceção.
*/
}
Agora, uma exceção séria.
Criando exceções
15
public class ImpossivelDividirPorZeroException {
int dividendo;
public ImpossivelDividirPorZeroException (int dividendo){
this.dividendo = dividendo;
}
public String getMessage() {
return “Impossível dividir “ + resultado + “ por zero!“;
}
}
Isso é uma exceção?
Criando exceçõespublic class ImpossivelDividirPorZeroException extends
Exception {
int dividendo;
public ImpossivelDividirPorZeroException (int dividendo){
this.dividendo = dividendo;
}
public String getMessage() {
return “Impossível dividir “ + resultado + “ por zero!“;
}
}
Isso é uma exceção?16
Lançando exceções
17
Um método que queira lançar uma exceção deverá ter duas coisas a mais.1. Declarar no seu cabeçalho que pode lançar uma
exceção.2. Ao detectar um erro, lançar a exceção.
Vejamos:
Lançando exceções
18
//...
//...
public int dividir(int dividendo, int divisor)
throws ImpossivelDividirPorZeroException {
if(divisor == 0) {
throw new ImpossivelDividirPorZeroException(dividendo);
} else {
return dividendo / divisor;
}
Lançando exceções
19
Observação:Um método que chama um outro método que pode lançar uma exceção PRECISA declarar no cabeçalho a possibilidade do lançamento, apesar de não ter o throw no seu corpo.
Exceções checadas e não checadas
20
Como prometido, o que é uma exceção não checada:
É uma exceção que não precisa ser declarada no cabeçalho do método que a lança.
E agora, o que é uma exceção checada?
Tratando exceções
21
Java nos coloca a disposição três blocos especiais para o tratamento de exceções: try catch e finally.
Como usamos? No próximo slide!
Tratando exceções
22
public static void main (String[] args) {
int a = 10;
int b = 0;
try {
int resultado = dividir(a, b);
} catch (ImpossivelDividirPorZeroException e) {
System.out.println(e.getMessage());
} finally {
System.out.println(“Passei pelo try ou pelo catch”);
}
System.out.println(“O resultado foi: “ + resultado);
}
Por que usar exceções? Separa o código de tratamento do código
“normal”. Propagação de erros mais efetiva. Possibilitar a criação de diferentes tipos de
erros para diferentes situações.
23
Exceções Dúvidas sobre exceções? Não sejam tímidos...
E agora, para uma coisa completamente diferente.
24
Memory leak
25
Acontece pouco em Java, por causa do Garbage Collector.
Cuidado! Ninguém manda no Garbage Collector!!
Garbage collector Vejamos como ele funciona, dado o código:
public class MinhaJanela extends Window {
Button b1;
Button b2;
public MinhaJanela() {
b1 = new Button(“1”);
b2 = new Button(“2”);
//....
b1 = b2;
}
}
26
Loops - Motivação Precisamos repetir muitas vezes algum trecho
de código Podemos não saber de antemão quanto
“muitas” é Aumento da produtividade do programador
28
Loops em Java Java fornece três tipos de loop controlador por
expressões booleanas. São eles:
while for do-while
29
O comando while Sintaxe:
...
while(condicao) {
bloco de código
}
Semântica: Enquanto condicao for true, execute o bloco de
código
30
O comando while Pode executar o bloco de código 0 ou mais
vezes. Deve ser utilizado quando não sabemos a
princípio quantas vezes será executado.
31
O comando for Sintaxe:...
for(inicializacao; condicao; incremento) {
bloco de código
}
Semântica: Baseado no while
inicializacao;
while(condicao) {
bloco de código
incremento;
}
32
O comando for Qualquer uma das 3 partes do for pode ser
omitida. A inicialização só é executada uma vez. A condição é verificada antes de cada
iteração. O incremento é executado após toda iteração.
33
O comando for Pode executar o bloco de código 0 ou mais
vezes. Deve ser utilizado quando sabemos quantas
vezes o bloco será executado.
34
O comando do-while Sintaxe:...
do {
bloco de código
} while(condicao);
Semântica: Execute o bloco de código enquanto a condição
for true
35
O comando do-while Pode executar o bloco de código 1 ou mais
vezes. Deve ser utilizado quando não sabemos a
princípio quantas vezes será executado, mas sabemos que pelo menos uma vez terá que ser executado.
36
Recursão O que é recursão?
Alguma coisa definida em termos de si próprio. Muito utilizado na matemática.
37
Recursão Um caso famoso:
Fatorial: n! = n * (n-1)!
5! = 5 * 4!
4! = 4 * 3!
3! = 3 * 2!
2! = 2 * 1!
1! = 1 * 0!
0! = 0 * -1!
Epa! Está faltando alguma coisa! O que?
38
Recursão O caso base é tão importante para a recursão
quanto o passo recursivo. Agora, a definição completa do fatorial:
n! = n * (n-1)! 1! = 1
39
Recursão em Java É simples:
public int fatorial(int n) {
int retorno;
if ( n == 1) {
retorno = 1;
} else {
retorno = n * fatorial(n - 1);
}
return retorno;
}
40