Você está na página 1de 44

Universidade Catlica do Salvador

Estrutura de Linguagens

Davi Loureno Jos Adauto Luis Cludio Maira Galindo Sidney Reis

SALVADOR 2007

Davi Loureno Jos Adauto Luis Cludio Maira Galindo Sidney Reis

Estrutura de Linguagens

Trabalho apresentado Universidade Catlica do Salvador referente matria Estrutura de Linguagens.

SALVADOR 2007

RESUMO DO TRABALHO
Este trabalho tem o objetivo de mostrar um estudo realizado sobre a linguagem de programao JAVA no que se refere ao seu histrico, modelo, tipificao e aplicabilidade, bem como critrios para sua avaliao, recursos nativos, controle e gerenciamento de exceo e programao concorrente de acordo com o que foi visto na matria Estrutura de Linguagens. Este estudo no tem preocupao com a implementao da linguagem, porm possui trechos de cdigos de programas nesta linguagem apenas de carter explicativo para facilitar o entendimento como um todo.

SUMRIO
VISO DO PROJETO......................................................................................................5 1.1.HISTORICO E APLICATIBILIDADE DA LP JAVA...............................................5 1.2.MODELO DALINGUAGEM JAVA..........................................................................6 1.3.MODELOS DE EXECUO. AVALIAO DA LINGUAGEM EM RELAO AOS CRITRIOS..............................................................................................................7 1.4.MECANISMOS QUE FACILITEM A PRODUO DEPROGRAMAS QUE ATENDAM AS SUAS ESPECIFICAES....................................................................8 1.5.FUNCIONAMENTO DO AMBIENTE DE GERAO DE CDIGO E EXECUO DE PROGRAMAS.....................................................................................9 1.6.FUNCIONAMENTO DO AMBIENTE DE GERAO DE CDIGOS E EXECUO DE PROGRAMAS.....................................................................................9 Sistema de Tipos em Java................................................................................................10 A linguagem Java oferece diversos tipos de dados que podem ser classificados basicamente em duas grandes categorias: tipos primitivos e tipos de referncias (estruturados homogneos e heterogneos). ...............................................................11 As caractersticas dos tipos de dados primitivos independem da plataforma em que o programa dever ser executado. Dessa forma, possibilita sua portabilidade entre diversos tipos de computadores, minimizando o esforo do desenvolvedor com a tarefa de converso de dados em formatos apropriados para a portagem. .................11 Tipo Boolean...............................................................................................................12 Este o tipo de dado mais simples encontrado em Java. Uma varivel booleana pode assumir apenas um entre dois valores: true ou false. Algumas operaes possveis em Java como a<=b e x>y tm como resultado um valor booleano, que pode ser armazenado para uso futuro em variveis booleanas. Estas operaes so chamadas operaes lgicas.........................................................................................................12 Tipos de dados inteiros................................................................................................12 Os tipos de dados primitivos byte, int, char, short e long constituem tipos de dados inteiros. Isso porque variveis desses tipos podem conter um valor numrico inteiro dentro da faixa estabelecida para cada tipo individual................................................12 TIPOS ESTRUTURADOS..............................................................................................13 Vetores e Matrizes ......................................................................................................13 A utilizao de vetores e matrizes em Java envolve trs etapas: declarar do vetor ou matriz; reservar de espao de memria e definir d tamanho e armazenagem de elementos. ...................................................................................................................14 2.AMBIENTE DE NOMES............................................................................................20 3.1.ASSOCIAO: AMARRAO, VINCULAO (BINDING).............................20 3.2.VINCULAO ESTTICA E DINMICA............................................................22 3.3.DURAO E GERENCIAMENTO DE MEMRIA..............................................24 3.4.DURAO, ALCANCE E VISIBILIDADE...........................................................25 3.TRATAMENTO DE EXCEES...............................................................................26 4.1.SISTEMA DE TRATAMENTO DE EXCEES...................................................26 4.2.HIERARQUIA DE EXCEES..............................................................................28 4.3.FLUXO DE EXECUO NORMAL E EXCEPCIONAL......................................29 4.4.EXCEES DEFINIDAS PELO USURIO...........................................................30 4.TRATAMENTO DE EXCEES...............................................................................31 4.5.SISTEMA DE TRATAMENTO DE EXCEES...................................................31 4

4.6.HIERARQUIA DE EXCEES..............................................................................33 4.7.FLUXO DE EXECUO NORMAL E EXCEPCIONAL......................................34 4.8.EXCEES DEFINIDAS PELO USURIO...........................................................35 PROGRAMAO CONCORRENTE.........................................................................37 Concorrncia relaciona-se com fluxo de controle: em um programa, existe mais de um fluxo de controle ativo. Execuo concorrente, tambm conhecida como execuo paralela, no significa execuo simultnea................................................................37 A execuo de unidades concorrentes admite as seguintes possibilidades:................37 O programa geralmente no possui controle sobre a ordem e o tempo de execuo das unidades concorrentes..................................................................................................38 5.1.O QUE SO THREDS E PARA QUE SERVEM ESSAS THREDS?.....................38 5.2.SINCRONIZAO...................................................................................................43 REFERENCIAS BIBLIOGRFICAS............................................................................43

VISO DO PROJETO. 1.1. HISTORICO E APLICATIBILIDADE DA LP JAVA.


Desenvolvida pela Sun Microsystems, teve como seu criador, James Gosling, e foi chamada de OAK (carvalho visto da janela de seu escritrio). Como j existia uma linguagem com este nome, foi dado o nome de Java (cidade de origem de um tipo de caf importado). A linguagem de programao Java por ser projetada para ser pequena, simples e portvel a todas as plataformas e sistemas operacionais causou um grande impacto no mercado de informtica, telefones celulares, palms e mais precisamente nas aplicaes web. Com sua sintaxe parecida com a linguagem C/C++, porm com algumas caractersticas prprias, caiu no gosto dos programadores. Sua portabilidade obtida pelo fato de ser uma LP compilada e interpretada. Por isso Java mais rpida do que se fosse apenas interpretada e portvel. Seu cdigofonte compilado gerando um arquivo nome_do_arquivo.class que chamado byte-code que no momento da execuo interpretado pela mquina virtual instalada no dispositivo.

Fases da execuo de um programa fonte em Java.

import java.awt.Graphics; public class HelloWorldApplet extends java.applet.Applet { public void paint (Graphics g) { g.drawString (Hello World!,5,25); } } Exemplo de um cdigo Java <HTML> <HEAD> <TITLE> Java </TITLE> </HEAD> <BODY> <APPLET CODE=nome.class WIDTH=300 HEIGHT=100> </APPLET> </BODY> </HTML> Exemplo de cdigo Java embutido em html

1.2. MODELO DALINGUAGEM JAVA.


A linguagem Java esta classificada no modelo de linguagem imperativo baseado na maquina de Von Neumann, pois uma linguagem de programao orientada a objetos, onde expressa seqncias de comandos que transformam os dados de entrada em resultados de sada de acordo com o uso de como os computadores executam os programas em nvel de mquina.

Maquina de Von Neumann

1.3. MODELOS DE EXECUO. AVALIAO DA LINGUAGEM EM RELAO AOS CRITRIOS.


A linguagem Java utiliza tanto o modelo de execuo seqencial quanto a concorrente. Java permite mltiplas linhas de execuo (threads) num mesmo programa e oferece primitivas para sincroniz-las. Java tambm oferece: Processamento distribudo: Chamadas a funes de acesso remoto (sockets) e os protocolos Internet mais comuns (HTTP, FTP, Telnet, etc.) so suportadas em Java, de forma que a elaborao de aplicativos baseados em arquiteturas cliente-servidor facilmente obtida. Multithreading: A maior parte dos sistemas operacionais hoje no mercado do suporte multitarefa, como o Windows, OS/2 e Unix, ou seja, o computador capaz e executar diversas tarefas ao mesmo tempo. Cada um desses sistemas tem o seu tipo de multitarefa, preemptiva ou no, com ou sem multiprocessamento. Java tem o suporte a multitarefa embutido na linguagem: um programa Java pode possuir mais de uma linha de execuo (thread). Por exemplo, clculos extensos, que em geral demandam muito tempo do processador, podem ser escritos em uma

thread, e a parte de interface com o usurio, que depende mais dos perifricos de I/O que do processador, pode ser executada em outra thread. Programao concorrente em geral uma tarefa difcil, mas Java fornece diversos recursos de sincronizao de processos que tornam a programao mais simples.

1.4. MECANISMOS QUE FACILITEM A PRODUO DEPROGRAMAS QUE ATENDAM AS SUAS ESPECIFICAES.

LEGIBILIDADE:
Facilidade de ler e escrever programas. H uma desvantagem na LP Java devido os mesmos nomes serem diferentes, a depender de como so escritos (em letras maisculas ou minsculas). Palavras reservadas tornam a linguagem mais legvel medida que seus nomes do a ao a ser executada ou so usadas para separar entidades sintticas.

EXPRESSIVIDADE:
Representao clara e simples dos dados e procedimentos.

ORTOGONALIDADE:
Possibilidade de combinar entre si os componentes bsicos da LP.

PORTABILIDADE:
Possibilidade de ser executado em diferentes plataformas (Linux, Windows). Principal caracterstica das linguagens orientadas a objeto.

CONFIABILIDADE:

Ao receber os mesmos dados como parmetro de entrada na sua execuo, o mesmo programa dever mostrar os mesmos resultados de sada. Facilidade de deteco de erros haja vista que uma linguagem fortemente tipada. Sendo assim os erros de tipos so logo detectados em tempo de compilao. A eliminao do uso de ponteiros em favor do uso de vetores e objetos. O programador no consegue fazer uso de memria que no pertena a seu programa.

1.5. FUNCIONAMENTO DO AMBIENTE DE GERAO DE CDIGO E EXECUO DE PROGRAMAS.

TIPAGEM.

A LP Java possui tipagem forte, ou seja, o compilador e o ambiente de execuo se encarregam de fazer a verificao de tipos. Permitindo dessa forma a verificao de erros de tipos.

TRATAMENTO DE EXCEO.

Uma exceo uma indicao de um problema na execuo do programa. Na LP Java o numero e os tipos de erros podem aumentar de acordo com a extensibilidade do programa. Segundo Deitel (2000, p.741) O tratamento de excees de Java permite a um programa capturar todas as excees, todas as excees de um certo tipo ou todas as excees de um tipo relacionado. O tratamento de excees em Java foi projetado para cuidar de erros sncronos (tempo de compilao) e no em erros assncronos (tempo de execuo). Sendo assim na LP Java os programas devem ser mais claros, robustos e mais tolerantes a falha.

1.6. FUNCIONAMENTO DO AMBIENTE DE GERAO DE CDIGOS E EXECUO DE PROGRAMAS.


A LP Java baseada na implementao de linguagens com soluo hibrida (parte compilada e parte interpretada). Durante o processo de execuo posto um textofonte criado num editor de texto simples (p.ex.: notepad no Windows ou edit do 9

DOS) escrito na linguagem Java e salvo com a extenso java (nome_arquivo.java). Este cdigo-fonte submetido a um compilador que o converte num arquivo em linguagem de mquina chamado byte-code que ser interpretado dando a caracterstica de portabilidade. Apesar de ser uma linguagem portvel, no pode ser utilizada no DOS. H alguns problemas em utilizar o DOS como sistema operacional para a elaborao de aplicativos em Java. O primeiro a limitao em relao ao tamanho do nome do arquivo. Segundo a LP Java foi projetada para sistemas de 32 bits um suporte limitado.

Sistema de Tipos em Java


Tipos de dados so conjuntos de valores que exibem um comportamento uniforme diante de operaes associadas. Um tipo de dados determina a classe de valores que podem ser armazenados em uma varivel, passados como parmetro ou resultantes de uma expresso. A informao de tipo em uma linguagem de programao usada para prevenir ou detectar construes incorretas em um programa alm de determinar os mtodos de representao e manipulao de dados no computador. Um sistema de tipos consiste basicamente de um mecanismo para definio de tipos de dados atravs de construes da linguagem de programao, tais como constantes, variveis, parmetros e um conjunto de regras para determinar a sua equivalncia, a compatibilidade e a inferncia de tipos para fins de verificao da validade do uso de tipos em expresses, atribuies e parmetros. O conhecimento dos possveis valores de uma varivel essencial para o entendimento de um algoritmo. Saber quais so as operaes permitidas possibilita a deteco de vrios erros. O tradutor, de posse destas informaes, pode determinar o espao necessrio para as variveis e como proceder para a implementao das operaes e tratamento de excees. Verificaes de tipos (Type checks) so necessrias para assegurar que uma operao particular seja aplicada a operandos adequados. Podem ser executados em tempo de compilao ou em tempo de execuo. As linguagens podem ser estaticamente tipadas (toda varivel e parmetro tem um tipo fixo escolhido pelo programador) como o Java, Pascal, C, C++ e Dinamicamente tipadas (apenas valores tm tipos fixos) variveis e parmetros no possuem um tipo associado, mas podem assumir valores de diferentes tipos em diferentes trechos do programa. (Smalltalk, JavaScript)

10

A linguagem Java oferece diversos tipos de dados que podem ser classificados basicamente em duas grandes categorias: tipos primitivos e tipos de referncias (estruturados homogneos e heterogneos).

As caractersticas dos tipos de dados primitivos independem da plataforma em que o programa dever ser executado. Dessa forma, possibilita sua portabilidade entre diversos tipos de computadores, minimizando o esforo do desenvolvedor com a tarefa de converso de dados em formatos apropriados para a portagem.

TIPOS DE DADOS
Tipos Primitivos So tipos atmicos, indivisveis, no definidos com base em outros tipos de dados, geralmente refletem a estrutura de hardware (mesmo que virtualmente implementados), podendo ser mapeados diretamente, associados a um nome, a um conjunto finito de valores e a um conjunto pr-definido de operaes especiais. A razo para o tratamento especial que esses tipos constituem um conjunto de dados simples. Para estes tipos Java recuou na abordagem tomada por C e C++. Isto , ao invs da criao da varivel pelo uso de new, uma varivel automtica criada e no uma referncia. Estas variveis so alocadas diretamente na pilha, tornando o acesso muito mais eficiente. Java determina o tamanho de cada tipo primitivo. Esses tamanhos no se alteram de uma arquitetura de mquina para outra como acontece em muitas linguagens. Este tamanho no varia em razo de programas Java serem portveis. Tipo boolean byte char short int long float double void Tamanho 8-bit 16-bit 16-bit 32-bit 64-bit 32-bit 64-bit Mnimo -128 Unicode 0 -215 -231 -263 IEEE754 IEEE754 Mximo +127 Unicode 216- 1 +2151 +2311 +2631 IEEE754 IEEE754

Aps terem sido declarados, os tipos primitivos assumem automaticamente valores, isto , so inicializados, conforme tabela abaixo: Tipo Boolean byte int float Valor Padro False (byte)0 0 0.0f Tipo char short long double Valor Padro \\u0000 (null) (short)0 0L 0.0d

11

Tipo Boolean

Este o tipo de dado mais simples encontrado em Java. Uma varivel booleana pode assumir apenas um entre dois valores: true ou false. Algumas operaes possveis em Java como a<=b e x>y tm como resultado um valor booleano, que pode ser armazenado para uso futuro em variveis booleanas. Estas operaes so chamadas operaes lgicas.

Tipos de dados inteiros

Os tipos de dados primitivos byte, int, char, short e long constituem tipos de dados inteiros. Isso porque variveis desses tipos podem conter um valor numrico inteiro dentro da faixa estabelecida para cada tipo individual. Literais Como observado a palavra-reservada new no usada para inicializar uma varivel de um tipo primitivo. Conforme mencionado, tipos primitivos so tipos especiais construdos na linguagem. Eles no so criados a partir de classes. Um literal a representao em cdigo fonte de um valor fixo, so representados diretamente em seu cdigo sem requerer computao alguma. Como mostrado abaixo, possvel associar um literal a uma varivel de um tipo primitvo: boolean result = true; char capitalC = 'C'; byte b = 100; short s = 10000; int i = 100000; Tipos inteiros (byte, short, int e long) podem ser expressos usando sistemas de numerao decimal, octal ou hexadecimal. int decVal = 26; int octVal = 032; int hexVal = 0x1a; // Nmero 26, em decimal // Nmero 26, em octal // Nmero 26, em hexadecimal

Tipos de Dados de Ponto Flutuante Tipo de ponto flutuante (float e double) podem ser expressos usando E ou e (para notao cientfica), F ou f (Literal de ponto flutuante de 32-bits) e D ou d (Literal de ponto flutuante de alta preciso 64-bits, esse o padro e por conveno podes ser omitido). double d1 = 123.4; double d2 = 1.234e2; //mesmo valor que d1, porm em notao cientfica float f1 = 123.4f; Literais do tipo char e String podem conter caracteres Unicode (UTF-16). Onde char delimitado por aspas simples e String por aspas duplas

12

TIPOS ESTRUTURADOS

Vetores e Matrizes Virtualmente todas as linguagens de programao suportam vetores. Usar vetores em C e C++ arriscado porque eles so somente blocos de memria. Se um programa acessa alm do bloco de memria do vetor ou usa a memria antes de sua inicializao (erros comuns de programao), haver resultados imprevisveis. Um dos principais objetivos de Java a segurana, assim muitos dos problemas que afligem programadores em C e C++ no so repetidos em Java. Um vetor Java garantido para ser inicializado e no pode ser acessado alm de seus limites. A checagem de limite veio com o preo de ter um pequeno montante de memria a mais em cada vetor apenas para verificar o ndice em tempo de execuo, mas a compreenso que a segurana e a produtividade ampliadas cobrem o custo. Abaixo vemos uma representao de um vetor.

Quando voc cria um vetor de objetos, voc na realidade, est criando um vetor de referncias, e cada uma destas referncias automaticamente inicializada com um valor especial com sua prpria palavra chave: null. Quando Java encontra null, reconhece que a referncia em questo no est apontando para um objeto, pois preciso atribuir um objeto para cada referncia antes de us-la, e se tentar usar uma referncia que ainda null, o problema ser reportado em tempo de execuo. Ento, estes tpicos erros de vetores so prevenidos em Java. Pode-se tambm criar um vetor de primitivos. Novamente, o compilador garante inicializao porque ele zera a memria para este vetor. Um vetor simplesmente uma seqncia de outros objetos ou primitivos que so todos do mesmo tipo e empacotados juntos sob um nome identificador. Vetores so definidos e usados com o operador indexado colchetes fechados []. Para definir um vetor, simplesmente segue seu nome de tipo com colchetes fechados vazios: A obj_a = new A(); int[] a1; //Vetor umArray = new int[10]; // cria um int[] outroArray = {100, 200, 300, 1000}; int[][] m1; //Matriz bidimensional String[][] names = {{"Mr. ", "Mrs.

vetor de inteiros 400, 500, 600, 700, 800, 900, de inteiro; ", "Ms. "},

13

{"Smith", "Jones"}}; A utilizao de vetores e matrizes em Java envolve trs etapas: declarar do vetor ou matriz; reservar de espao de memria e definir d tamanho e armazenagem de elementos.

Enumeraes Uma enumerao um tipo definido pelo usurio. Uma enumerao, introduzida pela palavra chave enum e seguida por um nome de tipo, um conjunto de constantes representadas por identificadores. Os valores dessas constantes comeam em 0, a menos que seja especificado de outra forma e so incrementados por 1. Todavia, uma enumerao definida na classe Enum que faz parte do pacote java.lang. O trecho de cdigo abaixo mostra o uso de uma enumerao.
import java.util.*; public class Teste { public enum

Planet{MERCURIO, VENUS,TERRA,MARTE,JUPITER,SATURNO,URANO,N ETUNO, PLUTAO};

public Teste(){ for(Planet planet:Planet.values()){ System.out.print(planet.name() + " - "); System.out.print(planet.ordinal() + "\n"); } } public static void main(String args[]){ new Teste(); } }

COMPATIBILIDADE DE TIPOS
Quando duas variveis so de tipos compatveis, qualquer uma delas pode ter seu valor atribudo outra. Existem dois mtodos diferentes de compatibilidade de tipos: Compatibilidade de Nome - variveis so compatveis se estiverem na mesma declarao ou em declaraes que usem o mesmo nome de tipo. fcil de ser implementada, porm altamente restritiva; Compatibilidade de Estrutura - variveis so compatveis se os seus tipos tiverem estruturas idnticas. mais difcil de implementar porm garante maior flexibilidade. O Java utiliza a compatibilidade de objetos por estrutura e tipos primitivos por nome. A idia de compatibilidade de tipos est relacionada a questes de verificao de tipos Inferncia de tipo Capacidade que a linguagem tem para determinar os tipos das variveis tendo em considerao o contexto em que se encontram, alm dos operadores e tipos envolvidos.

14

Expresses so combinaes ordenadas de valores, variveis, operadores, parnteses e chamadas de mtodos, permitindo realizar clculos aritmticos, concatenarem strings, comparar valores, realizar operaes lgicas e manipular objetos. Uma expresso em Java pode produzir trs resultados: Um valor; Uma varivel (uma referncia a uma varivel); Nada (a expresso void). Com base nas regras de precedncia descrita a seguir o Java pode, na maioria dos casos, determinar o tipo resultante. Precedncia de Operadores H situaes em que necessrio juntar operadores diferentes numa mesma expresso. Nesse caso a associatividade no se aplica mais trivialmente. Torna-se necessrio determinar quais so os operandos de um operador e qual sua ordem de avaliao. Por exemplo, escrevendo a+b*c, somos levados naturalmente a multiplicar primeiro b com c e em seguida o somar o produto com a. Isto porque a multiplicao tem precedncia sobre a adio. A precedncia ento um conjunto de regras que permitem determinar quais so os operandos de um dado operador. No Java as regras de precedncia esto descritas na tabela abaixo: Operador .,[],(),(tipo) +,-,~,!,++,-* / % + << >> <,>,<=,>= ==,!= & ^ | && || ?: = Converso de Tipos Ao trabalhar com expresses, salvo quando todos os operando so do mesmo tipo, inevitvel ter que considerar converses entre um tipo de dado e outro. H basicamente dois tipos de converses de dados. O primeiro se refere a converso implcita na qual, os dados so convertidos automaticamente, praticamente sem a preocupao do programador (baseadas nas regras de converso da linguagem). O segundo tipo a converso explcita (efetuadas pelo programador) Converso Implcita As regras de converso resultam da capacidade de inferncia da linguagem e de sua tipificao. As regras de converso implcita empregadas pela linguagem Java so as seguintes: Descrio Mxima precedncia: separador, indexao, parmetros, converso de tipo Operador unrio: positivo, negativo, negao (inverso bit a bit), no (lgico), incremento, decremento Multiplicao, diviso e mdulo (inteiros) Adio, subtrao Translao (bit a bit) esquerda, direita sinalizada, e direita no sinalizada (o bit de sinal ser 0) Operador relacional: menor, menor ou igual, maior ou igual, maior Igualdade: igual, diferente Operador lgico e bit a bit Ou exclusivo (xor) bit a bit Operador lgico ou bit a bit Operador lgico e condicional Operador lgico ou condicional Condicional: if-then-else compacto Atribuio

15

Os operadores unrios ++ e -- convertem um tipo byte e short so convertidos para um int, e os demais tipos no so afetados; Para os operadores binrios, as regras so um pouco mais complicadas. o Para operaes envolvendo apenas inteiros, se um dos operandos for long, o outro ser convertido para um long antes de realizar a operao, a qual resultar num long. Caso contrrio, ambos os operandos so convertidos para um int e o resultado ser tambm um int, a menos que o resultado da operao seja grande demais para caber num int. Nesse caso, o resultado ser convertido para um long. Para operaes envolvendo nmeros de ponto flutuante, se um dos operadores for double, o outro ser convertido para double antes de realizar a operao e o resultado ser um double. Do contrrio, ambos os operando so convertidos para float, e o resultado ser um float.

Algumas vezes, porm, as converses implcitas no so suficientes para garantir um resultado esperado em uma expresso. Nesses casos, importante podermos controlar precisamente a ocorrncia de uma converso de tipo. Isto pode ser feito por meio de um operador unrio de converso, descrito com mais detalhes a seguir. Por exemplo: float eventos = 25.7; float dias = 7.2; x = (int)(eventos / dias); Converso Explcita Converso explicita realizada atravs do uso de type casting ou mtodos especficos disponibilizados wappers de tipos primitivos. O operador de cast, mostrado abaixo, tem sintaxe herdada do C. O valor da expresso forado a ser de um tipo particular, no importando a regra de converso de tipos. (tipo) expresso O cast de tipo tem a maior precedncia possvel, portanto podemos fazer o cast de a ou de b para ser do tipo float, e no h necessidade de parnteses extra. O cast no modifica o tipo da varivel, o tipo das variveis definido uma vez na declarao e no pode ser alterado. Determinao Dinmica de Tipos O Java disponibiliza um mecanismo que permite verificar e determinar o tipo de um objeto em tempo de execuo chamado RTTI. RTTI ou Run-Time Type Identification (Identificao de Tipos em Tempo de Execuo) garante que as converses sejam sempre seguras. No permite que um objeto seja convertido para uma classe invlida, fora da hierarquia (erro de compilao) nem dentro da hierarquia (erro de execuo). O cdigo a seguir demonstra um erro de execuo.
public class Teste { public static void main(String[] args) { Animal a = new Cachorro(); // Sem erro nenhum: Cachorro c = (Cachorro)a; // Erro de execuo (ClassCastException): Gato g = (Gato)a; // Erro de compilao:

16

String s = (String)a; } }

O mecanismo RTTI permite que seja determinado o tipo de um objeto atravs operador instanceof, que retorna verdadeiro se a instncia for da classe (direta ou indiretamente) em questo, sua sintaxe mostrada abaixo: <objeto> instanceof <Classe> O exemplo de cdigo abaixo demonstra o uso do operador instanceof:
public class Teste { public static void main(String[] args) { Animal[] vet = new Animal[] {new Cachorro(), new Gato(), new Gato(), new Cachorro()}; for (int i = 0; i < vet.length; i++) { if (vet[i] instanceof Cachorro) ((Cachorro)vet[i]).latir(); else if (vet[i] instanceof Gato) Gato)vet[i]).miar(); } } }

TIPO ABSTRATO DE DADOS (TAD)


a representao ou definio do tipo e as operaes sobre objetos em uma nica unidade sinttica, outras unidades do programa podem ter permisso para criar variveis do tipo definido. A representao dos objetos no visvel pelas unidades do programa que usam o tipo e as operaes sobre os objetos so aquelas oferecidas na definio. Proporciona uma abstrao sobre uma estrutura de dados em termos de uma interface bem definida. Podem combinar abstraes de dados e de procedimento. Possibilitam o encapsulamento, isto , definio isolada de outras unidades do programa, invisibilidade e proteo, pois a representao do tipo deve ser acessada somente no ambiente encapsulado. O encapsulamento promove uma organizao lgica de dados e respectivas operaes, ele separa utilizao e implementao. Tem como principais vantagens: O fato do cdigo e estrutura de dados de uma abstrao estar armazenados num mesmo lugar cria um programa bem estruturado e legvel que pode ser facilmente modificado. O aspecto do ocultamento da informao e encapsulamento proporcionam um nvel de proteo contra acessos inesperados estrutura de dados, o que mantm a integridade do objeto. Completando este conceito amplo podemos dizer que uma classe implementa um tipo abstrato de dados. So exemplos de tipos abstratos de dados: Uma rvore binria com as operaes usuais de insero, remoo, busca e etc.;

17

Uma representao para nmeros racionais (numerador, denominador) que possua as operaes aritmticas bsicas e outras de converso de tipos; Uma representao para ngulos na forma (Graus, Minutos, Segundos). Tambm com as operaes relacionadas, bem como as operaes para converter para radianos, entre outras.

Uma das principais estruturas que fornece as capacidades mencionadas acima se chama classe. Embora o conceito de classe seja independente do Java, importante ressaltar que classe um modelo ou especificao que define um tipo de objeto, enquanto objeto uma instncia de uma classe. Exemplo: Onde: x e y so variveis privadas, acessadas apenas internamente; <<Construtor>> esteretipo que indica que Clone um construtor da classe; Clone um mtodo que retorna a prpria instncia; Os Sets/Gets so mtodos que acessam as variveis privadas.

Cdigo Equivalente:
import java.util.*; public class Ponto { private int x; private int y; public Ponto() { } public Ponto clone() { return this; } public void moverPara(int dx, int dy) { this.x += dx; this.y += dy; } public int getValorX() { return this.x; } public void setValorX(int _x) { this.x = _x; } public int getValorY() { return this.y; } public void setValorY(int _y) { this.y = _y; } }

Atributos

18

Como dito, classes definem dados que suas instncias contero. A classe Ponto precisa armazenar as coordenadas do ponto sendo representado de alguma forma, ela o faz atravs de das variveis privadas x e y. Essas variveis so visveis apenas dentro da classe. Existem outros tipos de modificadores que se aplicam s classes, atributos e mtodos. Mtodos Alm de atributos, uma classe deve definir os mtodos que ir disponibilizar, isto , a sua interface, os servios oferecidos. A classe Ponto pode, por exemplo, prover um mtodo para mover o ponto de um dado deslocamento. Instanciao Uma classe para ser usada deve instanciada, isto , deve ser criado um objeto. A classe oferece um mtodo especial que executado no momento em que ela instanciada, este mtodo chamado de Construtor. Herana A herana um mecanismo atravs do qual novas e mais especializadas classes podem ser definidas em termos de classes pr-existentes. Um exemplo a criao de uma classe Funcionario, como uma subclasse de Pessoa.

Violao de Tipos
Um dos principais objetivos da utilizao de sistemas de tipos em linguagens de programao permitir a deteco de erros (de tipos). A verificao de tipos atividade de assegurar que os operandos de um operador sejam de tipos compatveis. Um tipo compatvel aquele vlido para o operador ou com permisso, nas regras da linguagem, para ser convertido pelo cdigo gerado pelo compilador para um tipo vlido. A essa converso chama-se coero. Um erro de tipo a aplicao de um operador a um operando de tipo imprprio. A deteco de erros pode ser feita de forma esttica, ou de forma dinmica, caso seja possvel deteco somente durante a execuo de programa, tais formas so descritas abaixo:

Esttica - violao de tipo por atribuio; Dinmica - violao de tipo por leitura, com valor proveniente do meio externo, resultante de expresses, somente poder ser detectada pelo ambiente de execuo.

Representao de tipos A representao interna pode ser direta, refletindo a prpria estrutura lgica do hardware, ou indireta, quando a varivel tem sua representao interna associada a um descritor de tipo como no caso do Java. A mquina virtual prov uma rea de dados, rea de mtodo, um heap, rea de frames, um pool de constantes e etc. idnticos independente da arquitetura de hardware utilizada. Representao de Objetos A JVM no requer qualquer estrutura particular interna para objetos. Na atual implementao da SUN, uma referncia para a instncia da classe um ponteiro que aponta para um par de outros

19

ponteiros: uma para uma tabela contendo os mtodos do objeto, um outro para o objeto de classe que representa o seu tipo e um outro ainda para a memria alocada no heap para os dados do objeto. Para maiores http://java.sun.com/docs/books/jvms/first_edition/html/VMSpecTOC.doc.html detalhes:

2.

AMBIENTE DE NOMES.

Na implementao de projetos para nomes devemos nos preocupar com o tamanho mximo para cada nome, a permisso para o uso de caracteres de conexo, a distino entre maisculas e minsculas e o uso de palavras reservadas. Na LP Java no existe um tamanho mximo para um nome de um objeto. Verificao dos caracteres de conexo (@, #, $, _, %, |) permitidos pela linguagem. Na LP Java nem todos os caracteres de conexo so permitidos. Mesmas palavras podem ser consideradas diferentes dependendo de serem escrita em maisculas ou minsculas. Palavras especiais em algumas linguagens podem ser chamadas de palavras reservadas em outras pode ser chamada de palavras chave. Em Java as palavras reservadas so independentes do contexto e no podem ser usadas como nomes.

3.1. ASSOCIAO: (BINDING).

AMARRAO,

VINCULAO

Um objeto pode ser identificado por seis informaes distintas. So elas: tipo, endereo de memria, valor, nome, tempo de vida, escopo. De posse dessas informaes possvel controlar e manipular os objetos. O conceito de amarrao ou vinculao (binding) se refere associao dos valores dados a cada uma dessas

20

informaes pertencentes ao objeto ou varivel. Por exemplo: uma varivel e seus atributos, ou uma operao com seu smbolo.

o Espao de tipos indica o valor e o tipo do objeto. o Tabela de identificadores indica o nome associado ao objeto. o Memria indica a posio de memria onde os nomes associados ao objeto se encontram. Exemplo de associao de informaes de um objeto: public class Circulo{ public float raio = 1; public float a; public float b; }
Classe circulo e seus atributos.

O momento em que a vinculao ocorre chamado tempo de vinculao. A vinculao pode ocorrer nos seguintes tempos: Projeto da Linguagem: i. possveis valores para o tipo float. ii. possveis tipos para raio. Implementao da Linguagem: 21

i. representao interna da memria para o valor 1. Tempo de compilao: i. tipo de raio. ii. significado do sinal de atribuio. Tempo de execuo: i. associao de raio a um endereo de memria. ii. valor de raio operao de atribuio do numero um varivel.

3.2. VINCULAO ESTTICA E DINMICA.


As amarraes podem ser classificadas em funo do instante de execuo (amarrao esttica ou dinmica) ou em funo do relacionamento entre os objetos (amarrao de tipo, valor, endereo e nome). A amarrao esttica determinada no tempo de compilao de um cdigo-fonte para associao dos objetos e suas caractersticas. Ou seja, possvel identificar detalhes do ambiente de programao (classes, dados, objetos e mtodos) independente de sua execuo. Amarrao dinmica determinada no tempo de execuo de um cdigo-objeto para associao dos objetos e suas caractersticas. Na amarrao dinmica possvel verificar o estado da CPU, o gerenciamento de memria e os processos em execuo ou os candidatos execuo. Em tempo de execuo os processos de vinculao podem ser: Automticos objetos criados e destrudos nos blocos de cdigo em execuo. So alocados na rea de memria chamada stack. Estticos variveis globais que so destrudas no final do programa. So alocados numa rea de memria chamada heap. Dinmicos variveis so alocadas e desalocadas dinamicamente. So armazenadas na heap.

As amarraes classificadas em funo do relacionamento entre os objetos so relacionadas abaixo: 1 class Aritmetica { 2 public static void main(Strings args[] ){ 3 int a; 4 int b = 10; 5 System.out.println ( O valor de a : + 2 * b + , o de b : + b ); 6 } 22 7}

Amarrao esttica de objetos

Linha 3 amarrao de tipo.

Linha 4 amarrao de tipo e valor.

23

3.3. DURAO E GERENCIAMENTO DE MEMRIA.


Antes de explicitar como funciona o gerenciamento de memria daremos uma breve definio do que vem a ser alocao e desalocao de memria. Alocao de memria marcar ou disponibilizar uma rea de memria para guardar um determinado dado, objeto ou varivel. Desalocao de memria quando a rea de memria alocada liberada para que um novo objeto possa us-la. Nas linguagens de programao onde se permite alocao dinmica de memria, o programador fica responsvel pela liberao da memria obtida com a alocao e que no esta mais sendo utilizada. Caso o programador no desaloque a rea de memria previamente alocada e que no esta mais utilizada h uma gerao de um problema chamado de vazamento de memria, que no permite que novos objetos sejam criados mesmo com espao de memria disponvel. Pensando em problemas gerados no uso de alocao e liberao de memria dinmica, os desenvolvedores da LP Java criaram um procedimento de coleta automtica de lixo a maquina virtual. Sendo assim os objetos que no esto sendo mais utilizados so identificados pelo procedimento que libera o espao utilizado por estes objetos, permitindo a criao de novos objetos.

24

As variveis estticas so criadas no inicio do bloco lgico, onde h uma alocao de posio de memria para as mesmas, e so destrudas no termino do bloco lgico, onde as posies de memria antes ocupadas so liberadas. class Robo{ public int x; public int y; public static int cont; public Robo (int ax, int ay){ x = ax; y = ay; cont ++; } }
Criao de variveis estticas com o modificador static.

Quando um objeto ou uma varivel dinmica criado o sistema aloca uma posio de memria para esse objeto ou varivel. Essa posio de memria ocupada at o termino da execuo do programa. Para criao de variveis dinmicas podemos utilizar o operador NEW.

Circulo = umcirc; umcirc = new Circulo( );


Exemplo da criao de uma varivel dinmica utilizando o operador NEW.

3.4. DURAO, ALCANCE E VISIBILIDADE.


A durao de uma varivel o tempo durante o qual essa varivel existe na memria. Esse tempo chamado de tempo de vida de uma varivel. As variveis declaradas dentro de um mtodo so chamadas de locais e possuem durao automtica, ou seja, so criadas no inicio do bloco lgico pertencente ao mtodo e destrudas no final do bloco lgico. As variveis estticas dentro da classe que as define e tem a durabilidade ate o final da execuo do programa. Como foi visto anteriormente as variveis podem ser usadas ao longo de todo o programa ou por partes do programa. A faixa de instruo onde a varivel pode ser visvel chama-se escopo de varivel. Os mtodos e as variveis de uma classe tm escopo de classe, e as variveis declaradas dentro de um bloco tm escopo de bloco.

25

Apesar de escopo e tempo de vida parecer estar relacionados, eles tm conceitos totalmente diferentes. Por exemplo: public void start( ){ int x = 5; ... useLocal ( ); ... } public void useLocal( ){ ... }

O escopo da varivel x est contido pelo metodo start( ). Porm o tempo de vida de x se estende durante toda a execuo do mtodo useLocal( ).

3.

TRATAMENTO DE EXCEES. 4.1. SISTEMA DE TRATAMENTO DE EXCEES.


O modelo de tratamento de excees adotado por Java similar ao adotado por C+ +. Visa preencher as lacunas existentes pela insuficincia da programao orientada a objeto para representar a complexidade do objeto na vida real. Java uma linguagem que faz forte uso do conceito de tratamento de excees. Em algumas linguagens que implementam tratamento perfeitamente possvel programar sem usar esse recurso, mas em Java no. Um dos motivos de o programador Java ter que saber tratamento de excees que os mtodos de classes definidas na linguagem podem gerar excees e na maioria das vezes o compilador obriga a escrita de tratadores (blocos try{} catch{}) para chamadas destes mtodos. Para estruturar o cdigo dessa forma, tem-se que levantar (jogar) uma exceo e tratar uma exceo. Uma exceo ser levantada quando for verificada uma condio anormal de funcionamento do programa, ento o mtodo que est sendo executado imediatamente terminado e o controle passa para o mtodo que o chamou, onde pode ocorrer um tratador da exceo ou no. Se ocorrer 26

um tratador, na maioria dos casos a exceo pra de se propagar ali mesmo. Se no ocorrer um tratador outras chamadas de mtodos so desfeitas, encerradas, podendo culminar no trmino do programa se toda a cadeia de chamada de mtodos for desfeita at chegar em main sem que se ache um tratador para esta exceo. Existem vrios modelos de tratamento de excees, o modelo adotado por Java recebe o nome de: termination model, justamente por essas terminaes de mtodos. As excees so erros em tempo de execuo atravs de objetos criados a partir de classes especiais que so "lanados" quando ocorrem condies excepcionais. Lanar ou jogar uma exceo suspender a execuo do mtodo atual e passar um objeto para o bloco catch mais prximo na cadeia de chamadas de mtodos atual. Isto feito atravs da declarao: throw nomedoobjeto; //ou throw new nomedaclassedoobjeto(argumentos do construtor) Throw como um break para mtodos. Podem ocorrer trs tipos de erros em tempo de execuo: 1. Erros de lgica de programao Ex: limites do vetor ultrapassados, diviso por zero Devem ser corrigidos pelo programador 2. Erros devido a condies do ambiente de execuo Ex: arquivo no encontrado, rede fora do ar, etc. Fogem do controle do programador, podendo ser contornados em tempo de execuo. 3. Erros graves onde no adianta tentar recuperao Ex: falta de memria, erro interno do JVM Fogem do controle do programador e no podem ser contornados. Uma exceo um tipo de objeto que sinaliza que uma condio excepcional ocorreu. Para isso, precisa-se criar uma new e depois lanar uma throw. IllegalArgumentExceptione=new IllegalArgumentException("Erro!"); throw e; // exceo foi lanada! A referncia desnecessria. A sintaxe abaixo mais usual: 27

throw new IllegalArgumentException("Erro!"); Uma declarao throw obrigatria em mtodos e construtores que deixam de capturar uma ou mais excees que ocorrem em seu interior: public void m() throws Excecao1, Excecao2 {...} public Circulo() throws ExcecaoDeLimite {...} throw declara que o mtodo pode provocar excees do tipo declarado (ou de qualquer subtipo).

4.2. HIERARQUIA DE EXCEES.


Como excees so objetos, pode-se definir hierarquias de classes de excees, que mapeiem, em termos de informaes, as condies anormais de seu programa contendo as mensagens de erro e as possveis solues. As excees geradas pela linguagem pertencem a uma hierarquia cujo topo a classe Throwable, imediatamente estendida por Error e Exception. Os tratadores de exceo so escolhidos comparando a classe da exceo jogada e a classe de excees que o tratador diz tratar. Assim sendo, o tratador: try { /*algo que possa gerar uma exceo*/ } catch (Exception erro) { /* aes de tratamento do erro com possvel nova tentativa de execuo dos mtodos chamados*/ } Seria capaz de tratar todas as excees que estejam abaixo de Exception (na hierarquia) geradas em try { }. Dispondo mais de um tratador (bloco catch) em seqncia, onde os primeiros s tratam as classes excees mais baixas da hierarquia, possvel escolher que cdigo de tratamento usar com cada tipo de exceo gerada. Por sorte, das excees levantadas pela linguagem, o programador s precisar tratar as da hierarquia de Exception. Ex. Acesso a ndice invlido do vetor sem corromper o sistema: //Classe principal, Arquivo Principal.java class Principal { public static void main(String args[]) { int a[]=new int[4]; try { a[4]=10; //linha acima gera exceo, os ndices validos so //quatro:0,1,2,3 //qualquer cdigo escrito aqui (depois de a[4]=10;) //nunca ser executado } catch(Exception e) { //refaz a pergunta do ndice a alterar ao usurio //e descobre que ele queria alterar o valor no ndice 3, escrevendo //12 a[3]=12;

28

} System.out.println(a[3]); } } O fato do cdigo imediatamente aps o ponto onde foi gerada a exceo no ser executado poderia ser um problema, como, por exemplo, precisar de uma chance de liberar recursos do sistema (ex..:fechar um arquivo) antes do mtodo ser terminado. para isso que existe em Java o bloco try{ } catch{}finally{}, que no existe em C++. A clusula finally{ } opcional, seu cdigo ser executado ocorra ou no uma exceo no bloco try{} . Exemplo clssico de uso do bloco try{} catch{} finally {}: try { //abre um arquivo //gera uma exceo com arquivos }catch (ExcecaoArquivo e){ //tenta recuperar arquivo e informaes perdidas finally { arquivo.close(); } finally tem sido usado para fechar arquivos, parar threads e descartar janelas.

4.3. FLUXO DE EXCEPCIONAL.

EXECUO

NORMAL

Uma exceo lanada interrompe o fluxo normal do programa.O fluxo do programa segue a exceo. Se o mtodo onde ela ocorrer no a capturar, ela ser propagada para o mtodo que chamar esse mtodo e assim por diante. Se ningum capturar a exceo, ela ir causar o trmino da aplicao. Se em algum lugar ela for capturada, o controle pode ser recuperado. Captura e declarao de excees: public class RelatorioFinanceiro { public void metodoMau() throws ExcecaoContabil { if ( ! dadosCorretos) { throw new ExcecaoContabil("Dados Incorretos"); } //instrues que sempre sero executadas } public void metodoBom() { try { ... instrues ... metodoMau(); // instrues sero executadas se exceo no ocorrer ... instrues ... 29

} catch (ExcecaoContabil ex) { System.out.println("Erro: " + ex.getMessage()); } ... instrues ... //instrues sero executadas se exceo no ocorrer ou // ou se ocorrer e for capturada } } O bloco try "tenta" executar um bloco de cdigo que pode causar exceo, sendo seguido por um ou mais blocos catch(TipoDeExcecao ref) e seguido ou no de um bloco finally. Os blocos cath recebe, tipo de exceo como argumento. Ocorrendo uma exceo no try, ela ir descer pelos catch at encontrar um que declare capturar exceo de uma classe ou superclasse de exceo. Apenas um bloco catch capturado. O bloco finally contm instrues que devem ser executadas independentemente da ocorrncia ou no de excees.

4.4. EXCEES DEFINIDAS PELO USURIO.


Para criar uma classe que represente sua exceo, basta estender java.lang.Exception: class NovaExcecao extends Exception { } No precisa de mais nada. O mais importante herdar de Exception e fornecer uma identificao diferente. O bloco catch usa o nome da classe para identificar excees. Pode-se, tambm, acrescentar mtodos, campos de dados e construtores como em qualquer classe. Uma observao importante que um bloco catch tambm pode gerar excees, assim, havendo uma exceo que no se conseguiu tratar, pode-se fazer um throw dela mesma ou mudar a classe da exceo e continuar propagando (throw de outra exceo), ou fazer a reparao do erro e jogar uma exceo para que seja completada por outros mtodos. Porm, se entre os blocos catch houver exceo da mesma hierarquia de classe, as classes mais especficas devem aparecer primeiro, caso contrrio, uma exceo do tipo da especfica jamais ser capturado. O compilador detecta esta situao e no compila o cdigo.

class Principal { 30

public static void main(String args[]){ Fracao a,b,c; a=new Fracao(5,3); b=new Fracao(2,0); System.out.print("Esta e' a fracao a: "); a.mostra(); System.out.print("Esta e' a fracao b: "); b.mostra(); try { c=a.divisao(b); c.mostra(); }cath(DivisaoPorZero minhaexcecao){ System.out.println("Nao posso dividir por zero"); } } } Os principais mtodos construtores de Exception so: Exception(); Exception(String message); Exception(String message, Trowable cause); Os principais mtodos de Exception so: String getMessage(); // retorna mensagem passada pelo construtor Trowable getCause(); // retorna exceo que causou esta exceo String toString(); // retorna nome da exceo e mensagem void printStackTrace(); // imprime detalhes sobre exceo As Exception so excees verificadas em tempo de compilao. O compilador exige que sejam capturadas ou declaradas pelo mtodo que potencialmente as provoca. Porm, existem excees que no so verificadas em tempo de compilao, presentes nas classes Runtime Exception e Error da API. As subclasses de Error no devem ser capturadas (so situaes graves em que a recuperao impossvel ou indesejvel). Subclasses de RuntimeException representam erros de lgica de programao que devem ser corrigidos. Podem ser capturados, mas, preferencialmente, devem ser corrigidos.

4.

TRATAMENTO DE EXCEES. 4.5. SISTEMA DE TRATAMENTO DE EXCEES.


O modelo de tratamento de excees adotado por Java similar ao adotado por C+ +. Visa preencher as lacunas existentes pela insuficincia da programao orientada a objeto para representar a complexidade do objeto na vida real. Java uma linguagem que faz forte uso do conceito de tratamento de excees. Em algumas

31

linguagens que implementam tratamento perfeitamente possvel programar sem usar esse recurso, mas em Java no. Um dos motivos de o programador Java ter que saber tratamento de excees que os mtodos de classes definidas na linguagem podem gerar excees e na maioria das vezes o compilador obriga a escrita de tratadores (blocos try{} catch{}) para chamadas destes mtodos. Para estruturar o cdigo dessa forma, tem-se que levantar (jogar) uma exceo e tratar uma exceo. Uma exceo ser levantada quando for verificada uma condio anormal de funcionamento do programa, ento o mtodo que est sendo executado imediatamente terminado e o controle passa para o mtodo que o chamou, onde pode ocorrer um tratador da exceo ou no. Se ocorrer um tratador, na maioria dos casos a exceo pra de se propagar ali mesmo. Se no ocorrer um tratador outras chamadas de mtodos so desfeitas, encerradas, podendo culminar no trmino do programa se toda a cadeia de chamada de mtodos for desfeita at chegar em main sem que se ache um tratador para esta exceo. Existem vrios modelos de tratamento de excees, o modelo adotado por Java recebe o nome de: termination model, justamente por essas terminaes de mtodos. As excees so erros em tempo de execuo tratadas atravs de objetos criados a partir de classes especiais que so "lanados" quando ocorrem condies excepcionais. Lanar ou jogar uma exceo suspender a execuo do mtodo atual e passar um objeto para o bloco catch mais prximo na cadeia de chamadas de mtodos atual. Isto feito atravs da declarao: throw nomedoobjeto; //ou throw new nomedaclassedoobjeto(argumentos do construtor) Throw como um break para mtodos. Podem ocorrem trs tipos de erros em tempo de execuo: 1. Erros de lgica de programao Ex: limites do vetor ultrapassados, diviso por zero Devem ser corrigidos pelo programador 2. Erros devido a condies do ambiente de execuo Ex: arquivo no encontrado, rede fora do ar, etc. Fogem do controle do programador, podendo ser contornados em tempo de execuo. 3. Erros graves onde no adianta tentar recuperao 32

Ex: falta de memria, erro interno do JVM Fogem do controle do programador e no podem ser contornados. Uma exceo um tipo de objeto que sinaliza que uma condio excepcional ocorreu. Para isso, precisa-se criar uma new e depois lanar uma throw. IllegalArgumentException=new IllegalArgumentException("Erro!"); throw e; // exceo foi lanada! A referncia desnecessria. A sintaxe abaixo mais usual: throw new IllegalArgumentException("Erro!"); Uma declarao throw obrigatria em mtodos e construtores que deixam de capturar uma ou mais excees que ocorrem em seu interior: public void m() throws Excecao1, Excecao2 {...} public Circulo() throws ExcecaoDeLimite {...} throw declara que o mtodo pode provocar excees do tipo declarado (ou de qualquer subtipo).

4.6. HIERARQUIA DE EXCEES.


Como excees so objetos, pode-se definir hierarquias de classes de excees, que mapeiem, em termos de informaes, as condies anormais de seu programa contendo as mensagens de erro e as possveis solues. As excees geradas pela linguagem pertencem a uma hierarquia cujo topo a classe Throwable, imediatamente estendida por Error e Exception. Os tratadores de exceo so escolhidos comparando a classe da exceo jogada e a classe de excees que o tratador diz tratar. Assim sendo, o tratador: try { /*algo que possa gerar uma exceo*/ } catch (Exception erro) { /* aes de tratamento do erro com possvel nova tentativa de execuo dos mtodos chamados*/ } Seria capaz de tratar todas as excees que estejam abaixo de Exception (na hierarquia) geradas em try { }. Dispondo mais de um tratador (bloco catch) em seqncia, onde os primeiros s tratam as classes excees mais baixas da hierarquia, possvel escolher que cdigo de tratamento usar com cada tipo de exceo gerada. Por sorte, das excees levantadas pela linguagem, o programador s precisar tratar as da hierarquia de Exception. Ex. Acesso a ndice invlido do vetor sem corromper o sistema: //Classe principal, Arquivo Principal.java

33

class Principal { public static void main(String args[]) { int a[]=new int[4]; try { a[4]=10; //linha acima gera exceo, os ndices validos so quatro:0,1,2,3 //qualquer cdigo escrito aqui (depois de a[4]=10;) //nunca ser executado } catch(Exception e) { //refaz a pergunta do ndice a alterar ao usurio //e descobre que ele queria alterar o valor no ndice 3, escrevendo 12 a[3]=12; } System.out.println(a[3]); } } O fato do cdigo imediatamente aps o ponto onde foi gerada a exceo no ser executado poderia ser um problema, como, por exemplo, precisar de uma chance de liberar recursos do sistema (ex..:fechar um arquivo) antes do mtodo ser terminado. para isso que existe em Java o bloco try{ } catch{}finally{}, que no existe em C++. A clusula finally{ } opcional, seu cdigo ser executado ocorra ou no uma exceo no bloco try{} . Exemplo clssico de uso do bloco try{} catch{} finally {}: try { //abre um arquivo //gera uma exceo com arquivos }catch (ExcecaoArquivo e){ //tenta recuperar arquivo e informaes perdidas finally { arquivo.close(); } finally tem sido usado para fechar arquivos, parar threads e descartar janelas.

4.7. FLUXO DE EXCEPCIONAL.

EXECUO

NORMAL

Uma exceo lanada interrompe o fluxo normal do programa.O fluxo do programa segue a exceo. Se o mtodo onde ela ocorrer no a capturar, ela ser propagada para o mtodo que chamar esse mtodo e assim por diante. Se ningum capturar a 34

exceo, ela ir causar o trmino da aplicao. Se em algum lugar ela for capturada, o controle pode ser recuperado. Captura e declarao de excees: public class RelatorioFinanceiro { public void metodoMau() throws ExcecaoContabil { if ( ! dadosCorretos) { throw new ExcecaoContabil("Dados Incorretos"); } //instrues que sempre sero executadas } public void metodoBom() { try { ... instrues ... metodoMau(); // instrues sero executadas se exceo no ocorrer ... instrues ... } catch (ExcecaoContabil ex) { System.out.println("Erro: " + ex.getMessage()); } ... instrues ... //instrues sero executadas se exceo no ocorrer ou // ou se ocorrer e for capturada } } O bloco try "tenta" executar um bloco de cdigo que pode causar exceo, sendo seguido por um ou mais blocos catch(TipoDeExcecao ref) e seguido ou no de um bloco finally. Os blocos cath recebem tipo de exceo como argumento. Ocorrendo uma exceo no try, ela ir descer pelos catch at encontrar um que declare capturar exceo de uma classe ou superclasse de exceo. Apenas um bloco catch capturado. O bloco finally contm instrues que devem ser executadas independentemente da ocorrncia ou no de excees.

4.8. EXCEES DEFINIDAS PELO USURIO.


Para criar uma classe que represente sua exceo, basta estender java.lang.Exception: class NovaExcecao extends Exception { } No precisa de mais nada. O mais importante herdar de Exception e fornecer uma identificao diferente. O bloco catch usa o nome da classe para identificar excees. Pode-se, tambm, acrescentar mtodos, campos de dados e construtores como em qualquer classe.

35

Uma observao importante que um bloco catch tambm pode gerar excees, assim, havendo uma exceo que no se conseguiu tratar, pode-se fazer um throw dela mesma ou mudar a classe da exceo e continuar propagando (throw de outra exceo), ou fazer a reparao do erro e jogar uma exceo para que seja completada por outros mtodos. Porm, se entre os blocos catch houver exceo da mesma hierarquia de classe, as classes mais especficas devem aparecer primeiro, caso contrrio, uma exceo do tipo da especfica jamais ser capturado. O compilador detecta esta situao e no compila o cdigo.

class Principal { public static void main(String args[]){ Fracao a,b,c; a=new Fracao(5,3); b=new Fracao(2,0); System.out.print("Esta e' a fracao a: "); a.mostra(); System.out.print("Esta e' a fracao b: "); b.mostra(); try { c=a.divisao(b); c.mostra(); }cath(DivisaoPorZero minhaexcecao){ System.out.println("Nao posso dividir por zero"); } } } Os principais mtodos construtores de Exception so: Exception(); Exception(String message); Exception(String message, Trowable cause); Os principais mtodos de Exception so: String getMessage(); // retorna mensagem passada pelo construtor Trowable getCause(); // retorna exceo que causou esta exceo String toString(); // retorna nome da exceo e mensagem void printStackTrace(); // imprime detalhes sobre exceo As Exception so excees verificadas em tempo de compilao. O compilador exige que sejam capturadas ou declaradas pelo mtodo que potencialmente as provoca. Porm, existem excees que no so verificadas em tempo de compilao, presentes nas classes Runtime Exception e Error da API. As subclasses de Error no devem ser capturadas (so situaes graves em que a recuperao impossvel ou indesejvel). Subclasses de RuntimeException representam erros de lgica de programao que

36

devem ser corrigidos. Podem ser capturados, mas, preferencialmente, devem ser corrigidos.

PROGRAMAO CONCORRENTE.
Programao concorrente um modelo de programao onde vrios processos colaboram para atingir um determinado objetivo. A programao concorrente tem sido usada freqentemente na construo de sistemas operacionais e em aplicaes nas reas de comunicao de dados e controle industrial. A maior parte dos sistemas operacionais hoje no mercado do suporte multitarefa, como o Windows, OS/2 e Unix, ou seja, o computador capaz e executar diversas tarefas ao mesmo tempo. Cada um desses sistemas tem o seu tipo de multitarefa, preemptiva ou no, com ou sem multiprocessamento. Java tem o suporte a multitarefa embutido na linguagem: Um programa Java pode possuir mais de uma thread. Por exemplo, clculos extensos, que em geral demandam muito tempo do processador, podem ser escritos em uma thread, e a parte de interface com o usurio, que depende mais dos perifricos de I/O que do processador, pode ser executada em outra thread. A programao concorrente usado, para designar a programao paralela e a programao distribuda. Concorrncia relaciona-se com fluxo de controle: em um programa, existe mais de um fluxo de controle ativo. Execuo concorrente, tambm conhecida como execuo paralela, no significa execuo simultnea. A execuo de unidades concorrentes admite as seguintes possibilidades: Pseudo-paralela: Execuo em um nico processador; Paralela: Execuo em vrios processadores que compartilham uma memria; Distribuda: Execuo em vrios processadores independentes, sem compartilhamento de memria.

37

O programa geralmente no possui controle sobre a ordem e o tempo de execuo das unidades concorrentes. Diferentes threads no mesmo programa compartilham um ambiente global (memria, processador, registradores, etc.). Java uma linguagem de programao que permite ao programador especificar que os aplicativos executem threads, cada thread designando uma parte de um programa que pode ser executado simultaneamente com outras threads. Esse recurso, chamado multi-threading, oferecendo ao programador Java recursos poderosos, no disponveis em C e C++. Existem duas maneiras bsicas de se criar uma thread em Java: herdando da classe java.lang.Thread ou implementando a interface java.lang.Runnable. Os objetivos da programao concorrente so:

Reduzir o tempo total de processamento.


Mltiplos processadores. Aumentar confiabilidade e disponibilidade. Processadores distribudos. Obter especializao de servios. Sistemas operacionais. Simuladores. Implementar aplicaes distribudas. Correio eletrnico.

5.1. O QUE SO THREDS E PARA QUE SERVEM ESSAS THREDS?


Antes de falar em threads, explicar o que so e para que servem, vamos mostrar como um programa funciona: todo programa possui uma rea de dados e uma rea de texto (que a rea que contm as instrues do programa). Quando uma programa "rodado", criado pelo sistema operacional um processo, que nada mais do que o programa sendo executado. No momento da criao do processo existe uma nica linha de execuo nele, e thread nada mais do que isso: uma linha de execuo dentro de um processo.

38

A programao multi-thread, como o prprio nome sugere, acontece quando se tem vrias threads (isto , vrias linhas de execuo) dentro da mesma aplicao (processo). Isso possivel porque todas as threads compartilham a mesma rea de processo, portanto elas "rodam" sobre a mesma rea de texto . Em um ambiente multi-processado (plataforma com vrios processadores) as vrias threads podem ser escalonadas para diferentes processadores e neste momento se tem uma aplicao verdadeiramente paralela, com as vrias threads atuando ao mesmo tempo. Em um ambiente mono-processado esse paralelismo ento simulado, alguma entidade (no caso de Java essa entidade a Mquina Virtual Java) fica responsvel por escalonar o procesador para as vrias threads do processo. O sistema operacional de qualquer plataforma multi-tarefa (exemplo: Windows, Linux, ...) faz esse mesmo escalonamento s que no com threads, mas com processos. Ao contrrio de outras linguagens de programao que utilizam o conceito de threads atravs de bibliotecas especficas. Java incorpora este conceito dentro da prpria linguagem e por isso no necessrio linkar seu programa multi-thread com nenhuma outra biblioteca externa. Existem basicamente duas formas de se criar uma thread em Java: herdando da classe java.lang.Thread ou implementando a interface java.lang.Runnable (a classe java.lang.Thread implementa esta interface). Abaixo seguem dois exemplos de como criar threads bem simples que imprimem mensagens em um buffer. Ao compilar o trecho de cdigo abaixo, executando a classe principal vrias vezes, verifica-se que as sadas de cada execuo so diferentes uma das outras devido concorrncia da aplicao. Threads Herana

39

1. public class ThreadHeranca extends java.lang.Thread{ 2. private StringBuffer buf; 3. private String texto; 4. public ThreadHeranca(StringBuffer buf, String texto){ 5. this.buf = buf; 6. this.texto = texto; 7 } 8. public void run(){ 9. for(int i=0; i < 20; i++){ 10. buf.append(texto); 11. try { 12. sleep((long)(Math.random() * 100)); 13. } 14. catch (InterruptedException ie) 15. } 16. } 17.}

1)Uma das formas de se criar uma thread herdando da classe java.lang.Thread. 2) Referncia ao buffer compartilhado que ir ser alterado pela thread. 3) Referncia ao objeto String que contm o texto que ser inserido no buffer. 4-6) Construtor que ir inicializar as variveis do objeto. 7) Esta uma das partes mais importantes da criao de uma thread. Este o mtodo que ser chamado quando a thread comear a ser executada. Caso o programador no implemente este mtodo, uma implementao default que no faz nada fornecida pelo compilador, mas normalmente o programador ter a necessidade que sobrecarregar este mtodo colocando nele o cdigo que dever ser executado pela thread.

40

8-9) Esta thread ir acrescentar 20 vezes o contedo do objeto String texto no final do buffer. 10-12) A thread colocada para dormir por um tempo arbitrrio para dar a aplicao um aspecto de imprevisibilidade (e tambm para dar tempo mquina virtual de escalonar as outras threads para executar j que este cdigo muito rpido).

1-2) Declarao da classe e do mtodo main. 3) Criao do buffer que ter referncias em cada thread. 4-6) Criaco das threads (elas apenas foram criadas, a execuo de cada uma delas ainda no foi disparada). 7-9) Agora cada uma das threads tem a sua execuo iniciada. Note que chamamos o mtodo start() que no foi implementado pelo programador. A explicao para isso que este mtodo implementado pela classe java.lang.Thread e nada mais do que uma chamada Mquina Virtual Java para ela criar uma thread que executar concorrentemente o mtodo run() que implementamos anteriormente. O leitor pode estar se perguntando por que no chamamos diretamente o mtodo run() que contm o cdigo que queremos executar. A resposta que se fizrmos isso o mtodo main() iria esperar o retorno do mtodo run() e no haveria assim concorrncia nenhuma, seria uma chamada a uma funo normal como outra qualquer. 10) Este cdigo apenas para fazer este mtodo "esperar" que as threads terminem a sua execuo (no usamos o mtodo sleep() porque estamos em um contexto esttico). 11) Finalmente imprimimos o resultado do buffer na tela para comprovarmos que as trs threads executaram seus respectivos cdigos concorrentemente. Java atravs da interface java.lang.Runnable. Para isso basta fazer uma pequena modificaes no exemplo anterior. ThreadInterface substituindo a classe ThreadHeranca com uma explicao das mudanas em relao anterior:
1: public class ThreadInterface implements Runnable{ 2: private StringBuffer buf;

41

3: 4: 5: 6: } 7: 8: 9: 10: } }

private String texto; public ThreadInterface(StringBuffer buf, String texto){ this.buf = buf; this.texto = texto; public void run(){ for(int i=0; i < 20; i++) { buf.append(texto); for(int j=0; j < Integer.MAX_VALUE/600; j++); }

Esta uma das poucas mudanas a se fazer na classe. Agora no mais herdamos da classe java.lang.Thread mas ao invs disso implementamos a interface java.lang.Runnable. Esta interface apenas requer que implementemos o mtodo public void run() que conter, assim como no exemplo anterior, o cdigo que ser executado pela thread. Principal2
1. public class Principal2{ 2. public static void main(String []args){ 3. StringBuffer buf = new StringBuffer(); 4. 5. 6. 7. 8. 9. 10. 11. } } Thread inter1 = new Thread(new ThreadInterface(buf, "thread 1\n")); Thread inter2 = new Thread(new ThreadInterface(buf, "thread 2\n")); Thread inter3 = new Thread(new Threadinterface(buf, "thread 3\n")); inter1.start(); inter2.start(); inter3.start(); for(int i=0; i < Integer.MAX_VALUE/10; i++); System.out.println(buf.toString());

1-3) Este cdigo idntico ao exemplo anterior. 4-6) Esta a nica mudana neste cdigo. Agora ns criamos um objeto java.lang.Thread passando como parmetro um objeto que implementa a interface Runnable (que o nosso objeto ThreadInterface). Aps isso podemos usar este objeto da mesma forma que fizemos com o exemplo anterior. 7-11) Este cdigo idntico ao exemplo anterior.

42

5.2. SINCRONIZAO
No momento que duas threads so disparadas dentro de uma aplicao, muitas vezes necessrio sincronizar essas linhas para evitar que os dados compartilhados entre elas se tornem inconsistentes ou ento que essas linhas atuem em momentos errados. Algumas bibliotecas que suportam threads oferecem este recurso atravs de mecanismos conhecidos por semforos, uma outra forma de se implementar sincronizao atravs do uso de uma construo de mais alto nvel chamada monitor. No caso de Java a prpria linguagem incorpora o conceito de monitores atravs da palavra-chave synchronized. Existem duas maneiras de se fazer isso: A sincronizao de competio que ocorre quando duas ou mais threads competem pelo mesmo recurso compartilhado, e por isso precisam se comunicar de alguma forma para que os dados no se tornem inconsistentes devido concorrncia das threads no acesso ao recurso. E a sincronizao de cooperao, que ocorre quando o aspecto mais importante de duas ou mais threads no a competio por um recurso, mas sim a comunicao entre elas para que uma atue num momento especfico que depende de uma ao ou estado da outra.

REFERENCIAS BIBLIOGRFICAS.
CAVALCANTI, GEORGE DARMITON DA CUNHA. Vinculao Esttica e Dinmica. 01/06/2007. Disponvel em: http://www.cin.ufpe.br/~if686/aulas/aula04_nomes.pdf. Acessado em: 01/06/2007 FIGUEIREDO, ORLANDO. Limitao de alcance, visibilidade. 31/05/2007. Disponvel em: http://www.java.icmc.usp.br/research/master/Orlando_Figueiredo/tese.pdf. Acessado em 31/06/2007. RINO, LUCIA HELENA MACHADO. 2004. Disponvel em: http://www.dc.ufscar.br/~lucia/notasDidaticas/LingProgram/SinteseEstendida.pdf. Acessado em: 01/06/2007 CESTA, ANDRE AUGUSTO. A Linguagem de Programao JAVA. MAIO 2004. DEITEL, H. M. Java, como programar. 2003 HORSTMANN, CAY. Big Java. 2004

43

44