• Nenhum resultado encontrado

Laboratório de Programação

N/A
N/A
Protected

Academic year: 2022

Share "Laboratório de Programação"

Copied!
44
0
0

Texto

(1)

Laboratório de Programação

Dr. Italo Santiago Vega Curso de Graduação Ciência da Computação Pontifícia Universidade de São Paulo

Copyright © 1998-2004, Italo S. Vega

(2)

Semana Data Tópico

1 2004-02-18 "Apresentação: computação e programas. Bibliografia. Avali- ação."

2 2004-02-25 "RECESSO: Carnaval."

3 2004-03-03 "Organização de informações. Ambiente Java."

4 2004-03-10 "BlueJ: familiarização e computação com objetos."

5 2004-03-17 "Variáveis; valores; expressões."

6 2004-03-24 "Representação de computações. Seleção simples (teoria)."

7 2004-03-31 "Seleção dupla."

8 2004-04-07 "Seleção múltipla."

9 2004-04-14 "Iteração com contador."

10 2004-04-21 "RECESSO: Dia de Tiradentes."

11 2004-04-28 "Iteração com sentinela."

12 2004-05-05 "Comunicação com o usuário."

13 2004-05-12 "Estrutura de dados: array."

I 14 2004-05-19 "Mecanismo de Exceções em Java"

15 2004-05-26

16 2004-06-02

17 2004-06-09

18 2004-06-16

19 2004-06-23

20 2004-06-30

(3)
(4)

Conteúdo

1 Erros, Faltas e Falhas 4

2 Tratamento de Exceções em Java 10

2.1 Hierarquia de Exceções . . . 22 2.2 Lançamento e Captura de Exceções . . . 24

(5)

Objetivos Mostrar o mecanismo de exceções do ambiente Java.

(6)

1 Erros, Faltas e Falhas

Erros Erros introduzem faltas nos programas que, ao serem executadas, provocam falhas de execução. Erros podem e devem ser corrigidos.

Exemplo 14.1 Situações comuns de erros que geram faltas:

Divisão por zero.

Acesso a um array utilizando-se um índice inválido.

Tentativa de usar uma referência null.

¨

(7)

Exceções Uma exceção é um sinal indicando uma situação excepcional, provocada por um fator externo ao programa. A ocorrência deste problema deve ser tratada por um trecho de programa que varia em natureza e quantidade de software para software.

Exemplo 14.2 Situações comuns que geram exceções (Figura a seguir):

Tentativa de abrir um arquivo inexistente.

Esgotamento de memória.

¨

(8)

Exceções são problemas causados por uma fonte externa ao programa. Quando uma falha acontece devido a esta fonte externa, a instrução faltosa gera uma exceção (throw an exception). Estes eventos podem ocorrer a qualquer momento, e o seu efeito é o de interromper a execução, caso a aplicação não tenha sido preparada para tratá-los

(Figura a seguir).

(9)

Estratégias de Tratamento de Exceções Três grandes estratégias podem ser aplicadas para lidar com exceções:

1. Ignorar todas, considerando apenas as mais importantes. O código fica mais claro, mas o programa irá se comportar de forma incorreta diante de uma situação

inesperada.

2. Tratar cada possibilidade juntamente com a lógica principal. O código fica

obscuro, mas o seu funcionamento é melhor. Nem todas as situções são previstas.

3. Programar a lógica normal, separada do tratamento da exceção. O texto que trata a exceção está localizado na região onde a exceção pode ocorrer. A vantagem deste enfoque é a proximidade entre a região de ocorrência da exceção e a região onde ela é tratada.

(10)

Exemplo 14.3 A Figura a seguir-a mostra o mapa de execução de um modelo de aplicação capaz de tratar exceções segundo esta última estratégia. Dois cenários de execução são apresentados:

Figura a seguir-b: um cenário normal de execução. Neste caso, não ocorre falha no ponto a.

Figura a seguir-c: um cenário snormal de execução. Neste caso, ocorre falha no ponto a, provocando um desvio para o trecho de rota que trata a falha.

Exemplo I

(11)

I Exemplo

a

tratamento [ Exceção ]

(a)

a

tratamento [ Exceção ]

(b)

a

tratamento [ Exceção ]

(c)

Figura 1: (a) Um mapa de execução com tratamento de exceção, (b) um cenário normal de execução, (c) e outro anormal.

¨

(12)

2 Tratamento de Exceções em Java

Blocos try Uma exceção que ocorre em um bloco try é normalmente tratada por um código especificado no bloco catch imediato:

hPadrão de tratamento de exceções em Javai

try {

// lógica "normal" (ignorando quaisquer exceções"

}

catch( <Tipo da Exceção> exceção ) { // tratamento da exceção

}

(13)

Exemplo 14.4 Considere o mapa de execução de uma aplicação que solicita um número para o usuário, mostrado na Figura a seguir(a).

main()

dado obterString()

numero converterInt( dado )

mostrar( numero ) exit( 0 )

(a)

main()

dado obterString()

numero converterInt( dado )

mostrar( numero ) exit( 0 )

(b)

main()

dado obterString()

numero converterInt( dado )

(c)

Figura 2: Um mapa de execução (a) para conversão de texto em número, um cenário normal (b) e outro anormal (c) de execução.

Exemplo I

(14)

I Exemplo Supondo que o valor do dado de entrada corresponda a 2, este mapa é percorrido do início ao fim sem a ocorrência de erros. Este cenário normal pode ser visualizado como na Figura a seguir(b). Entretanto, se 2.5 for usado como valor do dado de entrada, um cenário anormal é observado pela ocorrência de uma exceção, como mostrado na Figura a seguir(c).

Exemplo I

(15)

I Exemplo Este mapa pode ser implementado da seguinte forma em Java:

hExemplo de um programa com faltai

import javax.swing.JOptionPane;

public class Aplicacao {

public static void main( String[] args ) { String dado =

JOptionPane.showInputDialog( "Digite um numero:" );

int numero = Integer.parseInt( dado ); // <- falta System.out.println( numero );

System.exit( 0 );

} }

Exemplo I

(16)

I Exemplo A ocorrência da exceção é conseqüência de uma falha de execução. Tais exceções

podem ser tratadas por programação Figura a seguir.

main()

dado obterString()

numero converterInt( dado )

mostrar( numero ) exit( 0 )

[ Exceção ]

mostrar ( “Dado não numérico” )

Exemplo I

(17)

I Exemplo

main()

dado obterString()

numero converterInt( dado )

mostrar( numero ) exit( 0 )

[ Exceção ]

mostrar ( “Dado não numérico” )

(a)

main()

dado obterString()

numero converterInt( dado )

mostrar( numero ) exit( 0 )

[ Exceção ]

mostrar ( “Dado não numérico” )

(b)

Figura 3: Um mapa de execução para conversão de texto em número, um ce- nário com tratamento da exceção (a) e outro normal (b) de execução.

(18)

Em Java, pode-se tratar a exceção provocada pela falha de execução por um bloco try:

hExemplo de um programa com falta e tratamento de exceçãoi

import javax.swing.JOptionPane;

public class Aplicacao {

public static void main( String[] args ) { String dado =

JOptionPane.showInputDialog( "Digite um numero:" );

int numero = -1;

try {

numero = Integer.parseInt( dado );

}

catch( NumberFormatException ref ) { JOptionPane.showMessageDialog( null,

"Voce deve digitar um numero",

"Formato de numero invalido", JOptionPane.ERROR_MESSAGE );

}

System.out.println( numero );

System.exit( 0 );

(19)

} }

¨

(20)

Exercício 14.1

Escrever um programa que, ao ser executado, obtenha dois números do usuário (via teclado) e mostre a divisão entre eles.

Tarefa 14.1.1 Crie o projeto ex14.1.

Tarefa 14.1.2 Crie a classe Divisor, contendo o método dividir(a:int, b:int):int. Ao ser executado, este método divide o valor da variável a pelo valor da variável b, retornando o resultado.

Tarefa 14.1.3 Qual resultado é calculado quando os números de entrada são a=3 e b=6?

Tarefa 14.1.4 Qual exceção é gerada quanto se tenta calcular a divisão por ZERO (ou seja, b=0)? Como pode ser tratada?

RESOLVER...

(21)

Exercício 14.2

No programa anterior, substitua os tipos das variáveis a e b por double e repita o experimento. Como se diferenciam os resultados?

RESOLVER...

(22)

Exercício 14.3

PROBLEMA DE SCOTT Considere o seguinte problema, definido para inteiros positivos:

a) Escolha um número.

b) Repetidamente, faça:

Se o número for 1, páre.

Se o número for par, divida-o pela metade.

Se o número for ímpar, multiplique-o por 3 e some 1.

Ex.: começando pelo número 17, obtém-se a seqüência:

h17,52,26,13,40,20,10,5,16,8,4,2,1i

Este procedimento sempre pára qualquer entrada? Até agora, este é um problema sem solução: não se conseguiu provar que sempre pára, nem se conseguiu um

contra-exemplo.

(23)

Tarefa 14.3.1 Escreva uma aplicação que faça o seguinte:

a) Imprima seu nome.

b) Para cada número de 1 até 20, imprima a linha que começa com o número, seguido por dois pontos, seguido pela seqüência de Scott que começa com o

número. Separe os números da seqüência por um espaço. Ex.: no caso do número 17:

17: 52 26 13 40 20 10 5 16 8 4 2 1

RESOLVER...

(24)

2.1 Hierarquia de Exceções

A tecnologia Java classifica os eventos gerados pelas falhas de execução em erros e exceções. Estas, por sua vez, podem ser exceções pré-definidas ou definidas pelo usuário (Figura a seguir).

RuntimeException Usuário Error Exception

Throwable

(25)

Throwable – unifica as noções de erros e exceções.

Error - não deve ser tratado; deve ser corrigido.

Exception – pode ser tratado.

RuntimeException – recebem um tratamento padrão do ambiente de execução Java.

Usuário – para tratamento especificado pelo usuário.

(26)

Dos diversos erros e exceções definidos pela tecnologia Java, as seguintes são as mais comuns:

IOException – um problema de comunicação externa.

FileNotFoundException – arquivo inexistente

EOFException – tentativa de leitura após o término do arquivo

NullPointerException – tentativa de usar um contexto null (RuntimeException).

NumberFormatException – tentativa converter um String não-numérico em número (RuntimeException).

OutOfMemoryError – programa que esgotou toda a memória disponível (Error).

IllegalArgumentException – argumentos ilegais na execução de um método.

(27)

2.2 Lançamento e Captura de Exceções

Lançamento de Exceções O lançamento de uma exceção é feito quando se cria um objeto de uma classe Throwable, passando-a para o mecanismo throw.

Exceções podem ser lançadas apenas durante a execução de um método, desde que haja uma indicação de quais classes de exceções ele poderá lançar.

(28)

Exemplo 14.5 Considere o tanque representado pelo esquema da Figura a seguir.

contdo

capacidade delta

Tanque

Exemplo I

(29)

I Exemplo Em Java, o tanque pode ser descrito da seguinte forma:

hlab/tanque/Tanquei

public class Tanque {

public int capacidade = 5000; // litros public int conteudo; // do tanque

hTanque: métodosi }

O método de construção de tanques vazios é imediato:

hTanque: métodosi

// Construtor de tanques vazios:

public Tanque() { conteudo = 0;

}

Exemplo I

(30)

I Exemplo Entretanto, pode-se construir um tanque a partir de uma determinada quantidade inicial de água. Neste caso, duas situações deverão ser tratadas no modelo computacional do tanque:

quantidade inicial contendo um valor negativo, a qual deverá ser rejeitada, impedindo-se a construção do respectivo tanque.

quantidade inicial superando a capacidade do tanque, que também deverá ser rejeitada, impedindo-se a construção do respectivo tanque.

Exemplo I

(31)

I Exemplo Para impedir que um objeto da classe Tanque seja criado, lança-se uma exceção

apropriada:

hTanque: métodosi+≡

public Tanque( int inicial )

throws TanqueTransbordouException, IllegalArgumentException { if( inicial < 0 ) {

throw new IllegalArgumentException();

}

int delta = inicial - capacidade;

if( delta > 0 ) {

throw new TanqueTransbordouException( this, delta );

}

conteudo = inicial;

}

Exemplo I

(32)

I Exemplo Este construtor faz uso de duas classes de exceção:

IllegalArgumentException – indicando que a quantidade inicial é ilegal.

Esta classe é oferecida pela bibliteca de classes do ambiente Java.

TanqueTransbordouException – criada para este programa, indicando que o tanque contém excesso de água. É um exemplo de exceção do usuário.

Exemplo I

(33)

I Exemplo A codificação da classe TanqueTransbordouException segue o roteiro

estabelecido pela tecnologia Java:

hlab/tanque/TanqueTransbordouException.javai

public class TanqueTransbordouException extends Exception { public Tanque tanqueTransbordado;

public int excesso;

public TanqueTransbordouException( Tanque novo,

int quantidade ) { super();

tanqueTransbordado = novo;

excesso = quantidade;

} }

Exemplo I

(34)

I Exemplo O método para inserir uma determinada quantidade de água no tanque pode ser descrito da seguinte forma:

hTanque: métodosi+≡

public void acrescentar( int quantidade )

throws TanqueTransbordouException, IllegalArgumentException { // 1: verificação de argumento

if ( quantidade < 0 ) {

throw new IllegalArgumentException();

}

// 2: verificação de transbordamento

int delta = ( quantidade + conteudo ) - capacidade;

if ( delta > 0 ) {

throw new TanqueTransbordouException( this, delta );

}

// 3: confirmação de conteúdo conteudo += quantidade;

}

(35)

As duas primeiras verificações podem lançar exceções: uma devido a um valor

negativo, outra devido ao transbordamento do tanque de água. Caso nenhuma exceção seja lançada, o conteúdo do tanque é alterado de acordo com a quantidade de água informada.

Exemplo I

(36)

I Exemplo A retirada de água segue um padrão similar, devendo-se considerar, no entanto, a

possibilidade de retirada além do conteúdo atual do tanque:

hTanque: métodosi+≡

public void retirar( int quantidade )

throws TanqueInsuficienteException, IllegalArgumentException { // 1: verificação de argumento

if ( quantidade < 0) {

throw new IllegalArgumentException();

}

// 2: verificação de falta

int delta = quantidade - conteudo;

if( delta > 0 ) {

throw new TanqueInsuficienteException( this, delta );

}

// 3: confirmação de conteúdo conteudo -= quantidade;

}

(37)

Observa-se a utilização de uma nova classe de exceção:

TanqueInsuficienteException.

Esta classe segue o formato padrão sugerido pela tecnologia Java:

hlab/tanque/TanqueInsuficienteException.javai

public class TanqueInsuficienteException extends Exception { public Tanque tanqueInsuficiente;

public int falta;

public TanqueInsuficienteException( Tanque novo,

int quantidade ) { super();

tanqueInsuficiente = novo;

falta = quantidade;

} }

¨

(38)

Exercício 14.4

LANÇAMENTO DE EXCEÇÕES Considere o modelo do tanque de água descrito no texto.

Tarefa 14.4.1 Crie o projeto ex14.4.

Tarefa 14.4.2 Crie as classes Tanque, TanqueTransbordouException e TanqueInsuficienteException, conforme indicado no exemplo do texto.

Tarefa 14.4.3 Crie o tanque t1:Tanque com uma quantidade inicial de 1000 litros de água. Abra a janela de inspeção da instância t1.

Tarefa 14.4.4 Envie a mensagem t1.acrescentar(2000) e observe se o conteúdo do tanque se alterou de acordo.

Tarefa 14.4.5 Envie a mensagem t1.retirar(500) e observe se o conteúdo do tanque se alterou de acordo.

Tarefa 14.4.6 Envie a mensagem t1.acrescentar(3000). Qual a reação do computador? Porquê?

Tarefa 14.4.7 Crie um novo tanque t2, vazio e envie a mensagem t1.retirar(100). Qual a reação do computador? Porquê?

RESOLVER...

(39)

Captura de Exceções As exceções lançadas durante a execução das instruções de um método podem ser capturadas pelo próprio programa, ou, em último caso, pelo ambiente de execução da tecnologia Java.

A captura de uma exceção lançada é feita com o uso do mecanismo try-catch. No bloco try, inserem-se os métodos que, ao serem executados, podem lançar exceções.

Caso alguma for lançada, a sua captura se dará em algum catch indicado junto ao mecanismo try.

(40)

Exemplo 14.6 No caso do tanque, o mecanismo de captura de exceções poderia ser utilizado da seguinte forma:

hlab/tanque/Cenario.javai

public class Controlador { public Tanque t1;

public void criarTanque() { t1 = new Tanque();

}

public void aumentar() { try {

System.out.println( "Conteudo = " + t1.conteudo );

t1.acrescentar( 4000 );

System.out.println( "Conteudo +4000 = " + t1.conteudo );

t1.acrescentar( 2000 ); // <- (*) }

catch( IllegalArgumentException e ) {

System.err.println("Quantidade negativa");

}

catch( TanqueTransbordouException e ) { // <- (**)

(41)

System.err.println( "Excesso de " + e.excesso );

} } }

Depois de criado um objeto da classe Controlador, ao se enviar a mensagem aumentar(), uma exceção será lançada quando o objeto t1 receber a mensagem marcada com (*). A captura desta exceção é feita no catch marcado com

TanqueTransbordouException, na linha (**). ¨

(42)

Exercício 14.5

CAPTURA DE EXCEÇÕES Considere o modelo do tanque de água descrito no texto.

Tarefa 14.5.1 Crie a classe Controlador conforme indicado no exemplo do texto.

Tarefa 14.5.2 Crie o objeto c:Controlador e envie a mensagem

c.criarTanque() seguida de c.aumentar(). Qual a reação do computador?

Tarefa 14.5.3 Acrescente o método diminuir() na classe Controlador. Este método deverá enviar mensagens t1.retirar(...), forçando o lançamento da exceção TanqueInsuficienteException, a qual deverá ser adequadamente capturada.

Tarefa 14.5.4 Crie o objeto c:Controlador e envie a mensagem

c.criarTanque() seguida de c.diminuir(). Qual a reação do computador?

RESOLVER...

(43)

Semana Data Tópico

1 2004-02-18 "Apresentação: computação e programas. Bibliografia. Avali- ação."

2 2004-02-25 "RECESSO: Carnaval."

3 2004-03-03 "Organização de informações. Ambiente Java."

4 2004-03-10 "BlueJ: familiarização e computação com objetos."

5 2004-03-17 "Variáveis; valores; expressões."

6 2004-03-24 "Representação de computações. Seleção simples (teoria)."

7 2004-03-31 "Seleção dupla."

8 2004-04-07 "Seleção múltipla."

9 2004-04-14 "Iteração com contador."

10 2004-04-21 "RECESSO: Dia de Tiradentes."

11 2004-04-28 "Iteração com sentinela."

12 2004-05-05 "Comunicação com o usuário."

13 2004-05-12 "Estrutura de dados: array."

I 14 2004-05-19 "Mecanismo de Exceções em Java"

15 2004-05-26

16 2004-06-02

17 2004-06-09

18 2004-06-16

19 2004-06-23

20 2004-06-30

(44)

Referências

Documentos relacionados

Com base nos resultados da pesquisa referente à questão sobre a internacionalização de processos de negócios habilitados pela TI com o apoio do BPM para a geração de ganhos para

Figura A53 - Produção e consumo de resinas termoplásticas 2000 - 2009 Fonte: Perfil da Indústria de Transformação de Material Plástico - Edição de 2009.. A Figura A54 exibe

A Lei nº 2/2007 de 15 de janeiro, na alínea c) do Artigo 10º e Artigo 15º consagram que constitui receita do Município o produto da cobrança das taxas

Conforme pode ser visualizado nos quadros abaixo, apenas um professor que atua no curso de Licenciatura em Matemática obteve um desempenho médio abaixo do conceito mínimo

O termo ressuscitação com volumes pequenos foi relatado por Nakayama et al., 1984 13 , em um modelo experimental de choque hemorrágico, utilizando ove- lhas, no qual houve

A presente pesquisa demonstrou a participação ativa dos coletores de material reciclado e o reconhecimento do Poder Público local com o trabalho de parceria,

Os maiores coeficientes da razão área/perímetro são das edificações Kanimbambo (12,75) e Barão do Rio Branco (10,22) ou seja possuem uma maior área por unidade de

A abordagem mais usual de fadiga, que utiliza a tensão nominal e a classificação de detalhes geométricos para previsão da vida em fadiga, não abrange conexões mais complexas e