41
Exceções, Loops e Recursão Guilherme Carvalho (gvc)

Exceções, Loops e Recursão - cin.ufpe.brgvc/arquivos/aulas/Aula 02 - Exceções.pdf · Mais disso daqui a alguns slides. ... Muito utilizado na matemática. 37. Recursão ... fatorial(5)

  • Upload
    ngobao

  • View
    217

  • Download
    0

Embed Size (px)

Citation preview

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

Situações excepcionais Como a Microsoft trata?

5

6

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

Garbage collector

27

b1

b2

Xiiii!

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

Recursão em Java E se esquecêssemos o caso base?fatorial(5)

fatorial(4)

fatorial(3)

fatorial(2)

fatorial(1)

fatorial(0)

fatorial(-1)

fatorial(-2)

fatorial(-3)

fatorial(-4)

...

...

StackOverflow

41