Académique Documents
Professionnel Documents
Culture Documents
Prof. Peter Jandl Junior Ncleo de Educao a Distncia Universidade So Francisco 1999
Introduo ao Java
1 A Linguagem Java
efetuar o download e a execuo de cdigo Java via Internet. Apresentado formalmente pela Sun como o navegador HotJava e a linguagem Java no SunWorld'95, o interesse pela soluo se mostrou explosivo. Poucos meses depois a Netscape Corp. lana uma nova verso de seu navegador Navigator tambm capaz de efetuar o download e a execuo de pequenas aplicaes Java ento chamadas applets. Assim se inicia a histria de sucesso do Java. Numa iniciativa tambm indita a Sun decide disponibilizar o Java gratuitamente para a comunidade de desenvolvimento de software, embora detenha todos os direitos relativos linguagem e as ferramentas de sua autoria. Surge assim o Java Developers Kit 1.0 (JDK 1.0). As plataformas inicialmente atendidas foram: Sun Solaris e Microsoft Windows 95/NT. Progressivamente foram disponibilizados kits para outras plataformas tais como IBM OS/2, Linux e Applet Macintosh. Em 1997, surge o JDK 1.1 que incorpora grandes melhorias para o desenvolvimento de aplicaes grficas e distribudas e no incio de 1999 lanado o JDK 1.2, contendo muitas outras melhorias, de forma que tambm seja conhecido como Java 2. Atualmente a Sun vem liberando novas verses ou correes a cada nove meses bem como novas API (Application Program Interface) para desenvolvimento de aplicaes especficas. A ltima verso disponvel o JDK 1.3.
10
Introduo ao Java
otimizando a execuo, que nestes casos melhora significativamente a performance de programas Java. Segurana Considerando a possibilidade de aplicaes obtidas atravs de uma rede, a linguagem Java possui mecanismos de segurana que podem, no caso de applets, evitar qualquer operao no sistema de arquivos da mquina-alvo, minimizando problemas de segurana. Tal mecanismo flexvel o suficiente para determinar se uma applet considerada segura especificando nesta situao diferentes nveis de acesso ao sistema-alvo. Permite Multithreading Java oferece recursos para o desenvolvimento de aplicaes capazes de executar mltiplas rotinas concorrentemente bem dispe de elementos para a sincronizao destas vrias rotinas. Cada um destes fluxos de execuo o que se denomina thread, um importante recurso de programao de aplicaes mais sofisticadas. Alm disso, o Java uma linguagem bastante robusta, oferece tipos inteiros e ponto flutuante compatveis com as especificaes IEEE, suporte para caracteres UNICODE, extensvel dinamicamente alm de ser naturalmente voltada para o desenvolvimento de aplicaes em rede ou aplicaes distribudas. Tudo isto torna o Java uma linguagem de programao nica.
11
Exemplo 1 Primeiro Exemplo de Aplicao Java Utilize um editor de textos qualquer para digitar o exemplo, garantindo que o arquivo ser salvo em formato de texto simples, sem qualquer formatao e que o nome do arquivo ser Eco.java (utilize letras maisculas e minsculas exatamente como indicado!). Para podermos executar a aplicao exemplificada devemos primeiramente compilar o programa. Para tanto devemos acionar o compilador Java, ou seja, o programa javac, como indicado abaixo:
javac nome_do_arquivo.java
O compilador Java exige que os arquivos de programa tenham a extenso .java e que o arquivo esteja presente no diretrio corrente, assim, numa linha de comando, dentro do diretrio onde foi salvo o arquivo Eco.java digite:
javac Eco.java
Isto aciona o compilador Java transformando o cdigo digitado no seu correspondente em bytecodes, produzindo um arquivo Eco.class. No existindo erros o javac no exibe qualquer mensagem, caso contrrio sero exibidas na tela uma mensagem para cada erro encontrado, indicando em que linha e que posio desta foi detectado o erro.
12
Introduo ao Java
Tendo compilado o programa, ou seja, dispondo-se de um arquivo .class podemos invocar uma mquina virtual Java (JVM), isto , o interpretador Java, da seguinte forma:
java nome_do_arquivo
Note que no necessrio especificarmos a extenso .class para acionarmos a JVM. Digitando-se o comando abaixo executamos o programa Eco:
java Eco
Aparentemente nada aconteceu, mas se a linha digitada fosse outra contendo argumentos diversos tal como:
java Eco Testando 1 2 3
Na verdade o programa exemplo apresentado apenas imprime todos os argumentos fornecidos como um eco. Embora de utilidade duvidosa, esta aplicao nos mostra como proceder a compilao e execuo de programas escritos em Java utilizando o JDK.
Editor bytecodes
Verificador bytecodes
.java
.class
Figura 2 Ambiente de Desenvolvimento Java
Como visto, devemos utilizar um editor de textos ASCII simples para produzirmos o cdigo fonte de um programa que, obrigatoriamente deve ser alvo como arquivos de extenso .java. Utilizando o compilador javac o arquivo fonte transformado em bytecodes Java que podem ser executados em qualquer plataforma computacional que disponha de uma mquina virtual Java como ilustrado na Figura 3. Quando solicitamos a execuo do programa, tanto atravs do interpretador java como de sua verso run-time jre, o arquivo .class primeiramente carregado, verificado para garantir-se os requisitos de segurana do sistema e s ento propriamente
13
interpretado. No caso especfico das applets o navegador (browser) efetua o download de um arquivo .class interpretando-o ou acionando algum interpretador associado (plug-in). Em ambientes onde existam compiladores JIT (just in time) os bytecodes j verificados so convertidos em instrues nativas do ambiente durante a execuo, aumentando a performance das aplicaes ou applets Java.
ByteCodes J V M J C J V M J C J V M J C J V M J C
Win95/98 Win32
WinNT
Linux Unix
Solaris
Figura 3 Ambiente Java e os Bytecodes O resultado deste ambiente que o Java, embora interpretado inicialmente, tornase independente de plataforma, simplificando o projeto de aplicaes de rede ou distribudas que tenham que operar em ambientes heterogneos, alm de permitir a incorporao de vrios mecanismos de segurana.
14
Introduo ao Java
Operadores
Estruturas
de
Apresentaremos agora uma pequena discusso sobre a sintaxe da linguagem Java, abordando os tipos de dados existentes, as regras para declarao de variveis, as recomendaes gerais para nomenclatura, os operadores, sua precedncia e as estruturas de controle disponveis. Como ser notado, a sintaxe da linguagem Java muito semelhante quela usada pela linguagem C/C++.
15
2.1.2 Tipo de Dados em Ponto Flutuante No Java existem duas representaes para nmeros em ponto flutuante que se diferenciam pela preciso oferecida: o tipo float permite representar valores reais com preciso simples (representao interna de 32 bits) enquanto o tipo double oferece dupla preciso (representao interna de 64 bits). Os valores m ponto flutuante do Java esto em conformidade com o padro IEEE 754: Tipo Valor Mnimo Valor Mximo float double Tabela 3 Tipos de Dados em Ponto Flutuante Deve ser utilizado o ponto como separador de casas decimais. Quando necessrio, expoentes podem ser escritos usando o caractere e ou E, como nos seguintes valores: 1.44E6 (= 1.44 x 106 = 1,440,000) ou 3.4254e-2 (= 3.4254 x 10-2 = 0.034254). 2.1.3 Tipo de Dados Caractere O tipo char permite a representao de caracteres individuais. Como o Java utiliza uma representao interna no padro UNICODE, cada caractere ocupa 16 bits (2 bytes) sem sinal, o que permite representar at 32.768 caracteres diferentes, teoricamente facilitando o trabalho de internacionalizao de aplicaes Java. Na prtica o suporte oferecido ao UNICODE ainda bastante limitado embora permita a internacionalizao do cdigo Java. Alguns caracteres so considerados especiais pois no possuem uma representao visual, sendo a maioria caracteres de controle e outros caracteres cujo uso reservado pela linguagem. Tais caracteres podem ser especificados dentro dos programas como indicado na tabela abaixo, ou seja, precedidos por uma barra invertida (\): Representao Significado \n Pula linha (newline ou linefeed) \r Retorno de carro (carriage return) \b Retrocesso (backspace) \t Tabulao (horizontal tabulation) \f Nova pgina (formfeed) \ Apstrofe \ Aspas \\ Barra invertida \u223d Caractere UNICODE 233d \g37 Octal \fca Hexadecimal Tabela 4 Representao de Caracteres Especiais O valor literal de caracteres deve estar delimitado por aspas simples ( ). 2.1.4 Tipo de Dados Lgico Em Java dispe-se do tipo lgico boolean capaz de assumir os valores false (falso) ou true (verdadeiro) que equivalem aos estados off (desligado) e on (ligado) ou no (no) e yes (sim). Deve ser destacado que no existem equivalncia entre os valores do tipo lgico e valores inteiros tal como usualmente definido na linguagem C/C++.
16
Introduo ao Java
Ou seja, primeiro indicamos um tipo, depois declaramos uma lista contendo um ou mais nomes de variveis desejadas deste tipo, onde nesta lista os nomes so separados por vrgulas e a declarao terminada por ; (ponto e vrgula). Exemplos:
int i; float total, preco; byte mascara; double valorMedio;
17
Tambm possvel definirmos uma valor inicial para uma varivel diretamente em sua declarao como indicado a seguir:
int quantidade = 0; float angulo = 1.57; boolean ok = false; char letra = c;
Variveis podem ser declaradas em qualquer ponto de um programa Java, sendo vlidas em todos no escopo onde foram declaradas e nos escopos internos estes. Por escopo entende-se o bloco (conjunto de comandos da linguagem) onde ocorreu a declarao da varivel. 2.2.1 Regras para Denominao de Variveis Em Java recomenda-se que a declarao de variveis utilize nomes iniciados com letras minsculas. Caso o nome seja composto de mais de uma palavras, as demais deveriam ser iniciadas com letras maisculas tal como nos exemplos: contador total sinal posicaoAbsoluta valorMinimoDesejado mediaGrupoTarefa2 A utilizao de caracteres numricos no nome livre enquanto o uso do trao de sublinhar (underscore _) no recomendado.
2.3 Comentrios
Comentrios so trechos de texto, usualmente explicativos, inseridos dentro do programa de forma que no sejam considerados como parte do cdigo, ou seja, so informaes deixadas juntamente com o cdigo para informao de quem programa. O Java aceita trs tipos de comentrios: de uma linha, de mltiplas linhas e de documentao. O primeiro de uma linha utiliza duas barras (//) para marcar seu incio:
// comentrio de uma linha // tudo aps as duas barras considerado comentrio
O ltimo tipo semelhante ao comentrio de mltiplas linhas mas tem o propsito de documentar o programa:
/** comentrio de documentao que tambm * podem ter mltiplas linhas */
Geralmente o comentrio de documentao posicionado imediatamente antes do elemento a ser documentado e tem seu contedo extrado automaticamente pelo utilitrio javadoc fornecido juntamente com o JDK. Esta ferramenta gera pginas em formato html contendo os comentrio organizados da mesma forma que a documentao fornecida juntamente com o JDK. Aproveitando tal caracterstica do javadoc, usualmente se adicionam tags html aos comentrios de documentao para melhorar a forma final da documentao produzida com a incluso de imagens, tabelas, textos explicativos, links e outros recursos. Alm das tags html vrios tipos de informao administradas pelo javadoc podem ser adicionadas a estes comentrios especiais atravs de marcadores pr-definidos iniciados com @ que permitem a criao automtica de ligaes hipertexto entre a documentao e a formatao padronizada de outros elementos, tais como nome do autor, parmetros, tipo de retorno, etc. como abaixo:
18
Introduo ao Java
/** Classe destinada ao armazenamento de dados relacionados a * arquivos ou diretrios. * <p> Pode ser usada para armazenar rvores de diretrios. * @author Peter Jandl Jr * @see java.io.File */ public class FileData extends File { /** Construtor * @param filename nome do arquivo */ public FileData(String filename) { } }
2.4 Operadores
A linguagem Java oferece um conjunto bastante amplo de operadores destinados a realizao de operaes aritmticas, lgicas, relacionais e de atribuio. 2.4.1 Operadores Aritmticos Como na maioria das linguagens de programao, o Java possui vrios operadores aritmticos: Operador Significado Exemplo + Adio a+b Subtrao ab * Multiplicao a*b / Diviso a/b % Resto da diviso inteira a%b Sinal negativo (- unrio) -a + Sinal positivo (+ unrio) +a ++ Incremento unitrio ++a ou a++ -Decremento unitrio --a ou a-Tabela 5 Operadores Aritmticos Estes operadores aritmticos podem ser combinados para formar expresses onde deve ser observada a precedncia (ordem convencional) de avaliao dos operadores. Parntesis podem ser utilizados para determinar uma forma especfica de avaliao de uma expresso. A seguir um exemplo de aplicao que declara algumas variveis, atribui valores iniciais e efetua algumas operaes imprimindo os resultados obtidos.
// Aritmetica.java public class Aritmetica { static public void main (String args[]) { // Declaracao e inicializacao de duas variaveis int a = 5; int b = 2; // Varios exemplos de operacoes sobre variaveis System.out.println("a = " + a); System.out.println("b = " + b); System.out.println("-b = " + (-b)); System.out.println("a + b = " + (a + b)); System.out.println("a - b = " + (a - b)); System.out.println("a * b = " + (a * b)); System.out.println("a / b = " + (a / b)); System.out.println("(float) a / b = " + ((float)a / b));
19
b = = " "
= " " + +
Exemplo 2 Aplicao Aritmetica (operadores aritmticos) Compilando e executando o cdigo fornecido teramos o resultado ilustrado a seguir:
Figura 4 Resultado da Aplicao Aritmetica Embora o exemplo s tenha utilizado variveis e valores inteiros, o mesmo pode ser realizado com variveis do tipo ponto flutuante (float ou double) 2.4.2 Operadores Relacionais Alm dos operadores aritmticos o Java possui operadores relacionais, isto , operadores que permitem comparar valores literais, variveis ou o resultado de expresses retornando um resultado do tipo lgico, isto , um resultado falso ou verdadeiro. Os operadores relacionais disponveis so: Operador Significado Exemplo == Igual a == b != Diferente a != b > Maior que a>b >= Maior ou igual a a >= b < Menor que a<b <= Menor ou igual a a >= b Tabela 6 Operadores Relacionais Note que o operador igualdade definido como sendo um duplo sinal de igual (==) que no deve ser confundido com o operador de atribuio, um sinal simples de igual (=). Como possvel realizar-se uma atribuio como parte de uma expresso condicional, o compilador no faz nenhuma meno sobre seu uso, permitindo que uma atribuio seja
20
Introduo ao Java
escrita no lugar de uma comparao por igualdade, constituindo um erro comum mesmo para programadores mais experientes. O operador de desigualdade semelhante ao existente na linguagem C, ou seja, representado por !=. Os demais so idnticos a grande maioria das linguagens de programao em uso. importante ressaltar tambm que os operadores relacionais duplos, isto , aqueles definidos atravs de dois caracteres, no podem conter espaos em branco. A seguir um outro exemplo simples de aplicao envolvendo os operadores relacionais. Como para os exemplos anteriores, sugere-se que esta aplicao seja testada como forma de se observar seu comportamento e os resultados obtidos.
// Relacional.java import java.io.*; public class Relacional { static public void main (String args[]) { int a = 15; int b = 12; System.out.println("a System.out.println("b System.out.println("a System.out.println("a System.out.println("a System.out.println("a System.out.println("a System.out.println("a } } = " + a); = " + b); == b -> " != b -> " < b -> " > b -> " <= b -> " >= b -> "
+ + + + + +
(a (a (a (a (a (a
== b)); != b)); < b)); > b)); <= b)); >= b));
Exemplo 3 Aplicao Relacional (operadores relacionais) 2.4.3 Operadores Lgicos Como seria esperado o Java tambm possui operadores lgicos, isto , operadores que permitem conectar logicamente o resultado de diferentes expresses aritmticas ou relacionais construindo assim uma expresso resultante composta de vrias partes e portanto mais complexa. Operador Significado Exemplo && E lgico (and) a && b || Ou Lgico (or) a || b ! Negao (not) !a Tabela 7 Operadores Lgicos Os operadores lgicos duplos, isto , definidos por dois caracteres, tambm no podem conter espaos em branco. 2.4.4 Operador de Atribuio Atribuio a operao que permite definir o valor de uma varivel atravs de uma constante ou atravs do resultado de uma expresso envolvendo operaes diversas.
boolean result = false; i = 0; y = a*x + b;
Em Java vlido o encadeamento de atribuies, tal como abaixo, onde todas as variveis so inicializadas com o mesmo valor:
21
byte m, n, p, q; M m = n = p = q = 0;
// equivale a m = (n = (p = (q = 0)));
2.4.5 Precedncia de Avaliao de Operadores Numa expresso onde existam diversos operadores necessrio um critrio para determinar-se qual destes operadores ser primeiramente processado, tal como ocorre em expresses matemticas comuns. A precedncia este critrio que especifica a ordem de avaliao dos operadores de um expresso qualquer. Na Tabela 8 temos relacionados os nveis de precedncia organizados do maior (Nvel 1) para o menor (Nvel 15). Alguns dos operadores colocados na tabela no esto descritos neste texto. Nvel Operadores 1 . (seletor) [ ] ( ) 2 ++ -- ~ instanceof new clone - (unrio) 3 * / % 4 + 5 << >> >>> 6 < > <= >= 7 == != 8 & 9 ^ 10 | 11 && 12 || 13 ?: 14 = op= 15 , Tabela 8 Precedncia dos Operadores em Java Note que algumas palavras reservadas (instanceof, new e clone) se comportam como operadores. Operadores de um mesmo nvel de precedncia so avaliados conforme a ordem em que so encontrados, usualmente da esquerda para direita. Para modificarmos a ordem natural de avaliao dos operadores necessrio utilizarmos os parntesis, cujo nvel de avaliao o mais alto, para especificar-se a ordem de avaliao desejada.
22
Introduo ao Java
determinado pelo programa durante a execuo. No Java dispe-se da diretiva for. Estruturas de desvio de fluxo Destinadas a desviar a execuo do programa para uma outra parte, quebrando o fluxo sequencial de execuo. O desvio do fluxo pode ocorrer condicionalmente, quando associado a avaliao de uma expresso, ou incondicionalmente. No Java dispe-se das diretivas if e switch. Estruturas de repetio condicionais Semelhantes as estruturas de repetio simples mas cuja repetio est associada a avaliao de uma condio sendo geralmente utilizadas quando no se conhece de antemo o nmero necessrio de repeties. No Java dispe-se das diretivas while e do while. Alm destas estruturas existem ainda: Mecanismos de modularizao Estruturas de controle de erros
Figura 5 Variaes do Fluxo de Execuo de um Programa Os mecanismos de modularizao so aqueles que nos permitem a construo de funes e procedimentos (dentro do paradigma procedural) ou mtodos (dentro da paradigma da orientao objetos) e sero discutidos na prxima seo. J as estruturas de controle de erros constituem uma importante contribuio a programao pois simplifica bastante a a incluso e construo de rotinas de tratamento de erros dentro do cdigo. Antes de tratarmos especificamente das estruturas de controle da linguagem necessrio colocarmos algumas definies. Formalmente as instrues de um programa so chamadas diretivas (statements). Tradicionalmente as diretivas so escritas uma aps o outra num programa e so separadas de alguma forma, por exemplo com uma quebra de linha ou um caractere de pontuao. Em Java, tal como na linguagem C/C++, as diretivas so separadas uma das outras atravs do smbolo de pontuao ; (ponto e vrgula), sendo possvel existir vrias diretivas numa mesma linha desde que separadas por um ponto e vrgula. Abaixo temos um exemplo hipottico de vrias diretivas colocadas sequenciamente:
23
Como nas outras linguagens de programao, as estruturas de controle podem operar sobre diretivas isoladas (individuais) ou sobre vrias diretivas tratadas como um conjunto que denominado bloco. Um bloco em Java um grupo de diretivas delimitadas por chaves ({K}). Por sua vez um bloco de diretivas recebe um tratamento equivalente ao de uma nica diretiva individual.
{ diretiva1; diretiva2; diretiva3; M diretivaN; }
diretivaUnica;
2.5.1 Estruturas de repetio simples Como repetio simples consideramos um trecho de cdigo, isto , um conjunto de diretivas que deve ser repetido um nmero conhecido e fixo de vezes. A repetio uma das tarefas mais comuns da programao utilizada para efetuarmos contagens, para obteno de dados, para impresso etc. Em Java dispomos da diretiva for cuja sintaxe dada a seguir:
for (inicializao; condio de execuo; incremento/decremento) diretiva;
O for possui trs campos ou sees, todas opcionais, delimitados por um par de parntesis que efetuam o controle de repetio de uma diretiva individual ou de um bloco de diretivas. Cada campo separado do outro por um ponto e vrgula. O primeiro campo usado para dar valor inicial a uma varivel de controle (um contador). O segundo campo uma expresso lgica que determina a execuo da diretiva associada ao for, geralmente utilizando a varivel de controle e outros valores.
inicializao
Diretiva
24
Introduo ao Java
Aps a execuo da seo de inicializao ocorre a avaliao da expresso lgica. Se a expresso avaliada como verdadeira, a diretiva associada executada, caso contrrio o comando for encerrado e a execuo do programa prossegue com o prximo comando aps o for. O terceiro campo determina como a varivel de controle ser modificada a cada iterao do for. Considera-se como iterao a execuo completa da diretiva associada, fazendo que ocorra o incremento ou decremento da varivel de controle. A seguir um exemplo de utilizao da diretiva for:
import java.io.*; public class exemploFor { public static void main (String args[]) { int j; for (j=0; j<10; j++) { System.out.println(+j); } } }
Exemplo 4 Utilizao da Diretiva for Se executado, o exemplo acima dever exibir uma contagem de 0 at 9 onde cada valor exibido numa linha do console. 2.5.2 Estruturas de desvio de fluxo Existem vrias estruturas de desvio de fluxo que podem provocar a modificao da maneira com que as diretivas de um programa so executadas conforme a avaliao de uma condio. O Java dispe de duas destas estruturas: if e switch. O if uma estrutura simples de desvio de fluxo de execuo, isto , uma diretiva que permite a seleo entre dois caminhos distintos para execuo dependendo do resultado falso ou verdadeiro resultante de uma expresso lgica.
if (expresso_lgica) diretiva1; else diretiva2;
A diretiva if permite duas construes possveis: a primeira, utilizando a parte obrigatria, condiciona a execuo da diretiva1 a um resultado verdadeiro oriundo da avaliao da expresso lgica associada; a segunda, usando opcionalmente o else, permite que seja executada a diretiva1 caso o resultado da expresso seja verdadeiro ou que seja executada a diretiva2 caso tal resultado seja falso. Isto caracteriza o comportamento ilustrado pela Figura 7. A seguir um exemplo de uso da diretiva if.
import java.io.*; public class exemploIf { public static void main (String args[]) { if (args.length > 0) { for (int j=0; j<Integer.parseInt(args[0]); j++) { System.out.print("" + j + " "); } System.out.println("\nFim da Contagem"); } System.out.println("Fim do Programa"); } }
25
Ao executar-se ente programa podem ocorrer duas situaes distintas como resultado: se foi fornecido algum argumento na linha de comando (args.length > 0), o programa o converte para um nmero inteiro (Integer.parseInt(args[0])) e exibe uma contagem de 0 at o nmero fornecido e depois exibida uma mensagem final, seno apenas a mensagem final exibida. Caso se fornea um argumento que no seja um valor inteiro vlido ocorre um erro que sinalizado como uma exceo java.lang.NumberFormatException que interrompe a execuo do programa. J o switch uma diretiva de desvio mltiplo de fluxo, isto , baseado na avaliao de uma expresso ordinal escolhido um caminho de execuo dentre vrios possveis. Um resultado ordinal aquele pertencente a um conjunto onde se conhecem precisamente o elemento anterior e o posterior, por exemplo o conjunto dos nmeros inteiros ou dos caracteres, ou seja, um valor dentro de um conjunto cujos valores podem ser claramente ordenados (0, 1, 2 .... no caso dos inteiros e A, B, C... no caso dos caracteres).
falso
falso
Diretiva 1
Diretiva 2
Figura 7 Comportamento da Diretiva if O switch equivale logicamente a um conjunto de diretivas if encadeadas, embora seja usualmente mais eficiente durante a execuo. Na Figura 8 temos ilustrado o comportamento da diretiva switch. A sintaxe desta diretiva a seguinte:
switch (expresso_ordinal) { case ordinal1: diretiva3; break; case ordinal2: diretiva2; break; default: diretiva_default; }
A expresso utilizada pelo switch deve necessariamente retornar um resultado ordinal. Conforme o resultado selecionado um dos casos indicados pela construo case ordinal. As diretivas encontradas a partir do caso escolhido so executadas at o final da diretiva switch ou at uma diretiva break que encerra o switch. Se o valor resultante no possuir um caso especfico so executadas as diretivas default colocadas, opcionalmente, ao final da diretiva switch.
26
Introduo ao Java
Figura 8 Comportamento da Diretiva switch Note que o ponto de incio de execuo um caso (case) cujo valor ordinal aquele resultante da expresso avaliada. Aps iniciada a execuo do conjunto de diretivas identificadas por um certo caso, tais aes s so interrompidas com a execuo de uma diretiva break ou com o final da diretiva switch. A seguir temos uma aplicao simples que exemplifica a utilizao das diretivas switch e break.
// exemploSwitch.java import java.io.*; public class exemploSwitch { public static void main (String args[]) { if (args.length > 0) { switch(args[0].charAt(0)) { case 'a': case 'A': System.out.println("Vogal break; case 'e': case 'E': System.out.println("Vogal break; case 'i': case 'I': System.out.println("Vogal break; case 'o': case 'O': System.out.println("Vogal break; case 'u': case 'U': System.out.println("Vogal break; default: System.out.println("No } } else { System.out.println("No foi fornecido } } }
27
No exemplo, quando fornecido algum argumento, a aplicao identifica se o primeiro caractere deste uma vogal. Se o argumento no for iniciado por vogal ocorre a execuo da seo default da diretiva switch. Caso no existam argumentos fornecidos o programa imprime uma mensagem correspondente. 2.5.3 Estruturas de repetio condicionais As estruturas de repetio condicionais so estruturas de repetio cujo controle de execuo feito pela avaliao de expresses condicionais. Estas estruturas so adequadas para permitir a execuo repetida de um conjunto de diretivas por um nmero indeterminado de vezes, isto , um nmero que no conhecido durante a fase de programao mas que pode ser determinado durante a execuo do programa tal como um valor a ser fornecido pelo usurio, obtido de um arquivo ou ainda de clculos realizados com dados alimentados pelo usurio ou lido de arquivos. Existem duas estruturas de repetio condicionais: while e do while. O while o que chamamos de lao condicional, isto , um conjunto de instrues que repetido enquanto o resultado de uma expresso lgica (uma condio) avaliado como verdadeiro. Abaixo segue a sintaxe desta diretiva enquanto seu o comportamento ilustrado a seguir.
while (expresso_lgica) diretiva;
Note que a diretiva while avalia o resultado da expresso antes de executar a diretiva associada, assim possvel que diretiva nunca seja executada caso a condio seja inicialmente falsa. Um problema tpico relacionado a avaliao da condio da diretiva while o seguinte: se a condio nunca se tornar falsa o lao ser repetido indefinidamente.
falso
Figura 9 Comportamento da Diretiva while O do while tambm um lao condicional, isto , tal como o while um conjunto de instrues repetido enquanto o resultado da condio avaliada como verdadeira mas, diferentemente do while, a diretiva associada executada antes da avaliao da expresso lgica e assim temos que esta diretiva executada pelo menos uma vez. Seguem a sintaxe da diretiva do while e uma ilustrao do seu comportamento.
do diretiva while (expresso_lgica);
28
Introduo ao Java
Diretiva
verdadeiro Expresso Lgica falso Figura 10 Comportamento da Diretiva do while A seguir temos exemplos da aplicao destas duas diretivas de repetio.
// exemploWhile.java import java.io.*; public class exemploWhile { public static void main (String args[]) { int j = 10; while (j > Integer.parseInt(args[0])) { System.out.println(""+j); j--; } } }
Exemplo 7 Utilizao da Diretiva while O exemplo acima ilustra o uso da diretiva while tal como um lao de repetio simples equivalente a uma diretiva for como abaixo:
for (int j=0; j>Integer.parseInt(args[0]); j--) { System.out.println(""+j); }
29
2.5.4 Estruturas de controle de erros O Java oferece duas importantes estruturas para o controle de erros muito semelhantes as estruturas existentes na linguagem C++: try catch e try finally. Ambas tem o propsito de evitar que o programador tenha que realizar testes de verificao e avaliao antes da realizao de certas operaes, desviando automaticamente o fluxo de execuo para rotinas de tratamento de erro. Atravs destas diretivas, delimita-se um trecho de cdigo que ser monitorado automaticamente pelo sistema. A ocorrncia de erros no Java sinalizada atravs de excees, isto , objetos especiais que carregam informao sobre o tipo de erro detectado. Existem vrias classes de exceo adequadas para o tratamento do problemas mais comuns em Java, usualmente inclusas nos respectivos pacotes. Excees especiais podem ser criadas em adio s existentes ampliando as possibilidades de tratamento de erro. Com o try catch a ocorrncia de erros de um ou mais tipos dentro do trecho de cdigo delimitado desvia a execuo automaticamente para uma rotina designada para o tratamento especfico deste erro. A sintaxe do try catch a seguinte:
try { diretiva_normal; } catch (exception1) { diretiva_de_tratamento_de erro1; } catch (exception2) { diretiva_de_tratamento_de erro2; }
No Exemplo 7, a aplicao exibe uma contagem regressiva baseada num valor inteiro fornecido pelo primeiro argumento (args[0]). Se tal argumento no fornecido, ocorre uma exceo da classe java.lang.ArrayIndexOutOfBoundsException pois o cdigo tenta inadvertidamente usar um argumento que no existe (a mensagem exibida segue abaixo).
java.lang.ArrayIndexOutOfBoundsException at exemploWhile.main(Compiled Code)
Para evitar esse erro o programador poderia testar de forma convencional se foram fornecidos argumentos aplicao, como no Exemplo 6 (args.length > 0). A seguir temos uma nova verso do Exemplo 7 que contm uma estrutura convencional de teste do nmero de argumentos fornecido.
// exemploTeste.java import java.io.*; public class exemploTeste { public static void main (String args[]) { int j = 10; if (args.length > 0) { while (j > Integer.parseInt(args[0])) { System.out.println(""+j); j--; } } else { System.out.println("No foi fornecido um argumento inteiro"); } } }
30
Introduo ao Java
Caso no se forneam argumentos no ocorrer erro mas se o primeiro argumento fornecido no for numrico acontecer a sinalizao de uma exceo devido a tentativa converso efetuada para determinao do limite da contagem a se exibida. Outra alternativa a utilizao de uma diretiva try catch como abaixo:
// exemploTryCatch1.java import java.io.*; public class exemploTryCatch1 { public static void main (String args[]) { int j = 10; try { while (j > Integer.parseInt(args[0])) { System.out.println(""+j); j--; } } catch (ArrayIndexOutOfBoundsException e) { System.out.println("No foi fornecido um argumento."); } } }
Exemplo 10 Aplicao da Diretiva try catch Desta forma o cdigo e a rotina de tratamento de erros ficam mais claramente isolados, aumentando a legibilidade e facilidade de modificao do programa. Considerando que o argumento fornecido pelo usurio pode no ser um inteiro vlido ocorre uma outra exceo: java.lang.NumberFormatException pois a converso se torna impossvel. Contornar esse erro testando a validade do argumento requereria uma rotina extra no modo convencional. Com o uso da diretiva try catch teramos:
// exemploTryCatch2.java import java.io.*; public class exemploTryCatch2 { public static void main (String args[]) { int j = 10; try { while (j > Integer.parseInt(args[0])) { System.out.println(""+j); j--; } } catch (ArrayIndexOutOfBoundsException e) { System.out.println("No foi fornecido um argumento."); } catch (java.lang.NumberFormatException e) { System.out.println("No foi fornecido um inteiro vlido."); } } }
Exemplo 11 Utilizao da Diretiva try catch com 2 Excees Com o try finally temos um comportamento bastante diferente: uma rotina de finalizao garantidamente executada, isto , o trecho particular de cdigo contido na clusula finally sempre executado ocorrendo ou no erros dentro do trecho delimitado pela clusula try. A sintaxe do try finally colocada a seguir:
31
Isto particularmente interessante quando certos recursos do sistema ou estruturas de dados devem ser liberadas, independentemente de sua utilizao.
32