JAVA • Linguagem • Ambiente de Desenvolvimento • Runtime ou Java Virtual Machine JAVA Características • • • • • • • Parecida com C++ Compilada Portável Orientada a objetos Segura Suporte a concorrência Suporte a sistemas distribuídos Máquina Virtual • • • • Máquina emulada em software Java Specification Language Bytecodes JVM provê: conjunto de instruções, conjunto de registradores, formato dos bytecodes, gerenciamento automático de memória. Ambiente de Runtime Programa Simples 1 //Exemplo de comentario 2 public class AloMundo { 3 public static void main (String args[ ]) { 4 System.out.println("Alo Mundo!"); 5 } 6 } Exercício 1 //Exemplo de comentario 2 public class AloMundo { 3 public static void main (String args[ ]) { 4 System.out.println("Alo Mundo!"); 5 } 6 } Abra uma janela DOS na pasta do arquivo AloMundo.java. Compile com o javac AloMundo.java e execute com java AloMundo. Classes e Pacotes • Classe é um termo para um módulo que possui funcionalidade • O Java possui várias classes que implementam diversas funções • Pacote é um grupo de classes relacionadas Pacote java.lang String Math Integer Thread Documentação JAVA API • Em HTML e descreve: – Hierarquia da classe – Propósito geral – Lista resumida de variáveis, construtores e métodos – Lista detalhada com descrição de variáveis, contrutores e métodos Declaração • Uma linha de código terminada com ; x=5*i; if (x<50) resposta = "i é menor que 10"; for (int z=0;z<10;z++) a[z] = z; Bloco • Um grupo de declarações entre {} x=5*i; if (x<50) { resposta = "i é menor que 10"; } for (int z=0;z<10;z++) { a[z] = z; System.out.println(z); } Identificadores • São nomes utilizados para identificar classes, variáveis e métodos 1 //Exemplo de comentario 2 public class AloMundo { 3 public static void main (String args[ ]) { 4 System.out.println("Alo Mundo!"); 5 } 6 } Tipos Básicos • boolean verdade = true; • String texto = "aeiou"; • • • • • char letra = ‘a’; int idade = 31; long premio = 200000; float peso = 80.5 double distancia = 1200.34 Convenções de código • • • • • • • Classe: ContaBancaria, Curso Interface: Conta Métodos: saque(), adicioneCurso Variável: clienteAtual Constantes: VELOCIDADE_MAXIMA Use {} nas estruturas de controle Espaçamento Variáveis • • • • Tipos primitivos Tipos de referência Locais: dentro de métodos Atributos ou variáveis membro: dentro da classe Inicializando variáveis • Nenhuma variável pode ser utilizada antes de ser inicializada. • Variáveis locais devem ser inicializadas manualmente. • Variáveis membro são iniciadas automaticamente. Operadores • • • • • • + * / % == != !(expressão lógica) && || < > <= >= (expressão lógica) ? valor1:valor2 Concatenação de Strings • O operador + concatena Strings, criando uma nova String String saudacao = "Dr. "; String nome = "Pedro " + "Silva"; String titulo = saudacao + nome; Casting • • • • int d long a a = d; // faz uma conversão implícita d = (int) (a); // precisa conversão explícita Instruções Condicionais • Comando if if (nota > 7 && falta < 18) { aprovado=true; } else { aprovado=false; } Instruções Condicionais • Comando switch switch (valor) { case 1: instruções; break; case 2: instruções; break; default: instruções; break; } Instruções de Loop • Permite a execução repetida de blocos for (int i=0; i<10; i++) { instrução ou bloco; } Loop // testa antes de executar while (boolean) { instrução ou bloco; } // executa pelo menos uma vez do { instrução ou bloco; } while (boolean test); Controles Especiais • break ou break com rótulo • continue ou continue com rótulo Exercício 1. Crie um aplicação chamada Fatorial que imprima o fatorial de um numero. Para pedir um numero: int n = Integer.parseInt(JOptionPane.showInputMessage ("digite um numero")); 2. 3. Faça um programa que peça um número ao usuário. O programa deve dizer se o número é par ou impar. Se o número for par, o programa deve mostrar os números pares menores. Faça um programa que peça um número ao usuário e diga se é um número primo. Números primos são divisíveis apenas por 1 e pelo próprio número. Exercício 4. 5. Escreva o método main da classe Tabuada que imprime os valores multiplos de m menores que n. O usuário deve informar os valores de m e n. O valor de n deve ser maior que m. Por exemplo: Quais são os múltiplos de 2 (m) ate 8 (n)? Resposta: 0, 2, 4, 6 Escreva uma classe chamada AreaDoTrianguloRetangulo. Peça para o usuário digitar os valores da base e da altura do triângulo e mostre o valor da área e da hipotenusa. A área do triângulo é igual a base * altura / 2. A hipotenusa é igual a raiz quadrada da soma dos quadrados da base e altura (catetos). Dica: use a função Math.sqrt(n) para calcular a raiz. Criando uma classe • Definir um tipo que representa uma data class MinhaData { int dia; int mes; int ano; } • Declarando uma variável deste tipo MinhaData meuNascimento, seuNascimento; Criando um objeto • Objetos são criados com a função new MinhaData meuNascimento; meuNascimento = new MinhaData( ); • As variáveis que referenciam objetos servem para acessar sua estrutura meuNascimento.dia = 26; meuNascimento.mes = 11; meuNascimento.ano = 1960; Exercício 1. 2. Um ponto pode ser caracterizado por uma coordenada x e y. Defina uma classe chamada Ponto que representa esta idéia. As coordenadas são valores inteiros. Escreva uma classe Main com o método main ( ) dentro da classe; declare duas variáveis do tipo Ponto. Chame as variáveis de inicio e fim. Crie os objetos usando new Ponto( ). Atribua o valor 10 a x e y do objeto inicio. Mostre seus valores do objeto inicio. Atribua o valor 20 para a variável x do objeto fim, e o valor 30 para y do objeto fim. Mostre os valores x e y do objeto fim. Arrays • Um array é uma coleção de variáveis do mesmo tipo. • A coleção é acessada por índices • Arrays podem ser de qualquer tipo primitivo ou classe char s[]; ou Ponto p[]; ou char[] s; Ponto[] p; Criando Arrays • Arrays são criados com a função new s = new char[20]; p = new Ponto[100]; • Arrays de objetos não criam os objetos automaticamente. Os objetos são criados separadamente. p[0] = new Ponto(); p[1] = new Ponto(); Inicializando Arrays Ponto array[] = { new Ponto(), new Ponto(), new Ponto() }; // equivalente ao código abaixo Ponto array[] = new Ponto[3]; array[0] = new Ponto(); array[1] = new Ponto(); array[2] = new Ponto(); Arrays Multi-dimensionais int twoDim [ ] [ ] = new int [4][ ]; // arrays de mesmo tamanho twoDim[0] = new int [5]; twoDim[l] = new int [5]; // ou arrays de tamanhos diferentes twoDim[0] = new int [2]; twoDim[1] = new int [4]; twoDim[2] = new int [6]; twoDim[3] = new int [8]; Tamanho e redimensionamento • O tamanho de um array está no seu attributo length • Você não pode alterar o tamanho de um array, mas pode usar a mesma variável para criar um novo e maior array. Copiando Arrays • Use o método arrayCopy da classe System int dados[ ] = { 1, 2, 3, 4, 5, 6 }; int contagem[] = {10, 9, 8, 7, 6, 5, 4, 3, 2, 1}; System.arraycopy(dados, 0, contagem, 0, dados.length); Exercício 1. 2. Crie uma classe chamada Media. No método main, declare uma variável chamada notas do tipo array de int para 5 notas. Após o usuário informar as notas, o programa deve calcular e mostrar a média. Faça uma classe para perguntar 5 questões ao usuário. As perguntas devem ser definidas como um array de String. As respostas devem ser salvas em um array de Strings também. Ao final das perguntas o programa deve mostrar as perguntas e respostas. Classes e Objetos • Princípios dos Objetos – – – – Organizar dados e algoritmos Encapsulamento Polimorfismo Herança Classes e Objetos • • • • O elemento fundamental em Java é a classe Classe é um modelo para criar objetos Define a implementação dos métodos Todos os métodos tem que pertencer a uma classe • As variáveis definidas na classe são chamadas membros (atributos) Exemplo class EmpregadoInfo { String nome; String cargo; String departamento; } Para instanciar um objeto, crie e atribua valores aos membros: EmpregadoInfo emp = new EmpregadoInfo( ); emp.nome = "Marcos"; emp.cargo = "gerente"; emp.departamento = "RH"; Métodos • Método mostra() implementado na classe EmpregadoInfo class EmpregadoInfo { String nome; String cargo; String departamento; void mostra( ) { System.out.println(nome + " é " + cargo + " do " + departamento); } } Executando métodos Este método imprime os dados dos membros da classe quando o objeto foi criado e instanciado. EmpregadoInfo empregado = new EmpregadoInfo( ); emp.nome = "Marcos"; emp.cargo = "gerente"; emp.departamento = "RH"; empregado.mostra( ); A idéia que métodos compõe um objeto e podem interagir intimamente com seus dados é um conceito de orientação a objeto. Definindo métodos • Contém o código que manipula o estado do objeto • Recebe um número de parâmetros • Possue um tipo de retorno • Sintaxe: <modificador> <tipo_retorno> <nome> ([<parâmetros>]) [throws <exception>] { .... } Exemplos de métodos public class SalarioEmpregado { private double salario; public void aumentaSalario (double valor){ salario = salario + valor; } public double calculaImposto() { double imposto = 0; if (salario > 1200) { imposto = salario * 0.15; } else if (salario > 2900) { imposto = salario * 0.27; } return imposto; } } // fim da classe Passagem por valor • Toda passagem de argumentos é por valor, ou seja, uma cópia vai para o método chamado. • Quando o argumento é um objeto, o valor do argumento é uma referência ao objeto. O método pode mudar o conteúdo do objeto, mas nunca a referência. Referência this • this é uma referência ao objeto corrente • this acessa todas as variáveis membro e métodos do objeto corrente • this é utilizado quando outro objeto precisa conhecer o objeto corrente Exemplo usando this public class MinhaData { int dia, mes, ano; public void convidaAniversario( ) { Aniversario.envieConvite( this ); } } public class Aniversario { public static void envieConvite ( MinhaData d ) { System.out.print( "Convido para meu aniversario " ); System.out.print( " será dia " + d.dia ); System.out.print( " mes " + d.mes ); System.out.print( " ano " + d.ano ); } } Ocultando Dados public class Data { private int dia, mes, ano; } public class OutraClasse { public static void main(String args[ ]) { Data d = new Data( ); d.dia = 21; // ilegal! } } Encapsulamento • Protege os dados de um objeto de modificação imprópria, forçando o usuário a ter acesso aos dados por um método. • Assegura que os dados sempre sejam tratados da mesma forma. Sobrecarregando Métodos • Cada método possui uma assinatura. • A assinatura é composta pelo: – Nome do método – Número e tipo de seus argumentos • Permite escrever vários métodos com o mesmo nome em uma classe que fazem o mesmo trabalho, mas recebem argumentos diferentes. Sobrecarregando Métodos public void println(int i) public void println(float f) public void println( ) Exercício 1. 2. Crie uma classe chamada Lampada com um atributo boleano para indicar se ela está acesa ou apagada. Defina um método para ligar, um para apagar e outro para mostrar o estado da lampada. No método main crie um objeto para classe Lampada, ligue a lampada e mostre seu estado. Crie uma classe chamada ContaBancaria.java que represente atributos e operações de uma conta bancária. A conta deve ter os atributos cliente (String), número (int), saldo (double) e especial (boolean). A conta deve ter as operações depósito e saque. A operação depósito só pode aceitar valores positivos. A operação saque só pode aceitar valores menores que o saldo, mas se a conta for especial ela pode aceitar valores menores que o saldo mais 1000 reais. Exercícios 3. Crie uma classe chamada Terminal que no método main faça o seguinte: criar um objeto para classe ContaBancaria, definir valores para seus atributos, depositar 2000 reais, sacar 1200 reais, mostrar o saldo, sacar 1000 reais, definir como conta especial, sacar 1000 reais novamente e mostrar o saldo. Construindo e Inicializando Objetos • Utilizar a função new NomeDaClasse() • O que acontece? – Aloca espaço em memória para o objeto – Inicializa as variáveis da classe – Executa o construtor Construindo e Inicializando Objetos Construtores • • • • • Métodos especiais Possuem o mesmo nome que a classe Recebem ou não argumentos Não possuem tipo de retorno Os argumentos são fornecidos entre os parenteses que seguem o nome da classe • Toda classe tem um construtor Exemplo de Construtores public class Empregado { private String nome; private int salario; public Empregado(String n, int s) { nome = n; salario = s; } public Empregado(String n) { this(n, 0); } public Empregado( ) { this("Não definido"); } } Usando diferentes construtores Empregado objeto1 = new Empregado("Pedro",1500); Empregado objeto2 = new Empregado("Paulo"); Empregado objeto3 = new Empregado(); Pacotes • Pacote são grupos de classes relacionadas • Use a declaração de pacote package para relacionar a classe a um pacote • Use a declaração de importação import para indicar ao compilador onde achar as classes Exercício 1. Redefina a classe Lampada com um construtor que cria uma lampada no estado aceso (boleano igual a true). 2. Redefina a classe Lampada no pacote auto.eletrico. 3. Escreva a classe Carro no pacote auto com 2 atributos do tipo Lampada: um chamado farolEsquerdo e outro farolDireito. Defina métodos na classe Carro para acender e apagar os faróis e um método chamado mostra() que mostra se os faróis estão acesos ou não. No método main crie um objeto para classe Carro, execute o método que acende os faróis e execute o método mostra(). Compile e execute a classe Carro. Onde está a classe Carro e a classe Lâmpada em relação a pasta raiz? O que é Herança? • A partir de um modelo de uma classe criar uma versão especializada do modelo. • Por exemplo, você tem um modelo para classe Empregado e quer criar um modelo para Gerente. O Gerente é um Empregado com características adicionais. Modelo da Classe Empregado public class Empregado { String nome; Date admissao; Date nascimento; } Modelo da Classe Gerente public class Gerente { String nome; Date admissao; Date nascimento; String cargo; int nivel; String departamento; Empregado surbordinados[ ]; } A palavra chave Extends public class Empregado { String nome; Date admissao; Date nascimento; } public class Gerente extends Empregado { String cargo; int nivel; String departamento; Empregado surbordinados[ ]; } Herança • Se Gerente estende a classe Empregado, ele tem todas as variáveis e métodos da classe Empregado. • Qualquer operação válida para Empregado também é válida para Gerente Herança Simples • Java permite estender somente uma classe • Herança simples torna o código menos confuso • Você pode ter vários níveis na hierarquia • Construtores não são herdados Polimorfismo • Criar uma classe a partir de outra com herança permite o polimorfismo do objeto, ou seja, manipular o objeto por classes diferentes. • Um objeto tem só uma forma, mas pode ser referenciado pelas superclasses. • Em Java a classe Object é a classe pai para todas as outras classes Polimorfismo Object geral; geral = new String("texto"); geral = new Empregado(); Isso é possível, pois Empregado é uma subclasse de Object. public class Empregado extends Object public class Gerente extends Empregado Java permite referênciar um objeto com uma variável que é um dos tipos da classe pai. Empregado teste = new Gerente( ); Coleções Heterogêneas Empregado equipe[ ] = new Empregado [1024]; equipe[0] = new Gerente( ); equipe[l] = new Empregado( ); Polimorfismo de Argumentos // na classe Empregado public Imposto calculaImposto(Empregado e) { //calcula e retorna a faixa de imposto } // em outra classe Gerente objeto = new Gerente( ); Imposto ir = calculaImposto (objeto); Operador instanceof • Esta função permite verificar se um objeto é um instância de determidada classe. public void method(Empregado emp) { if (emp instanceof Gerente) { // traz o salário } else if (emp instanceof Contratado) { // traz o valor da horas } else { // empregado normal } } Convertendo Objetos public void method(Empregado emp) { if (emp instanceof Gerente) { Gerente objeto = (Gerente)emp; System.out.println("This is the Gerente of objeto.departamento); } // resto da operação } " + Sobrescrevendo Métodos • Permite redefinir o comportamento de um método herdado da classe pai • Deve ter a mesma assinatura do método na classe pai Sobrescrevendo Métodos public class Empregado { String nome; int salario; public String getDetalhes( ) { return "Nome: " + nome + "\n" + "Salario: " + salario; } } public class Gerente extends Empregado { String departamento; public String getDetalhes( ) { return "Nome: " + nome + "\n" + "Gerente de " + departamento; } } Sobrescrevendo Métodos Empregado objetoEmpregado = new Empregado( ); Gerente objetoGerente = new Gerente( ); Ao invocar objetoEmpregado.getDetalhes( ) e objetoGerente.getDetalhes ( ), eles executarão, respectivamente, o método getDetalhes( ) da classe Empregado e getDetalhes ( ) da classe Gerente. Sobrescrevendo Métodos Empregado objeto = new Gerente( ); objeto.getDetalhes ( ) o método a ser chamado será o da classe Gerente, pois você apenas criou uma variável do tipo Empregado, mas o objeto é um Gerente. Regras para Sobrescrever • Tipo de retorno deve ser igual ao pai • Não pode ser menos acessível que o pai • Não pode lançar exceções diferentes Sobrescrevendo Métodos public class Pai { public void metodo ( ) { } } public class Filho extends Pai { private void metodo ( ) { // ilegal } } Referência super • Está disponível em todos os métodos nãoestáticos e construtores. • É uma referência ao objeto pelo modelo da superclasse. • A execução de super.metodo() utiliza a implementação do método na superclasse. super public class Gerente extends Empregado { private String departamento; public String getDetalhes( ) { // chama metodo da superclasse return super.getDetalhes( ) + “ Departamento: " + departamento; } } Construtores da classe Pai • Você pode construir parte ou todo objeto pelo modelo da classe pai. • Invoque o construtor da classe pai com super na primeira linha do construtor da classe filho. Construtor da classe Pai public class Empregado { String nome; public Empregado(String n) { nome = n; } } public class Gerente extends Empregado { String departamento; public Gerente(String s, String d) { super( s ); departamento = d; } } Exercício 1. 2. 1. Redefina a abstração de uma conta corrente em duas classes: ContaSimples e ContaEspecial. A classe ContaSimples tem os atributos cliente, número e saldo. As operações são: public void deposito(double valor), public void saque(double valor), public boolean temSaldo(double valor) e public void mostraSaldo(). A classe ContaEspecial, além de ser uma conta simples, tem um limite que é uma variável do tipo double. A operação temSaldo da ContaEspecial deve levar em conta este limite. Faça uma classe chamada GerenciaConta, e no método main teste as classes ContaSimples e ContaEspecial. Características da Linguagem • • • • • • Variáveis, métodos e código estáticos Orientado a objetos Classes, métodos e variáveis final Classes abstratas e interfaces Controle de acesso Classes internas e wrappers (envelopes) Variáveis Estáticas • Variáveis compartilhadas entre todas as instâncias de uma classe • É semelhante a uma variável global em outras linguagens • Se a variável não for private, ela pode ser acessada pelo nome da classe: NomeDaClasse.nomeDaVariavel Variáveis Estáticas public class CEP { public static final int R_XV = 89200; public static final int R_AMERICA = 89201; } public class Correio { public void metodo( ) { int x = CEP.R_XV; } } Métodos Estáticos public class Quadrado { public static int calculaArea(int x, int y) { return x * y; } } public class Grafico { public static void main( String[] a) { int a = 9; int b = 10; int c = Quadrado.calculaArea(a, b); System.out.println("Area é igual a " + c); } } Código Estático • Uma classe pode conter blocos de código estático. • Este código executa apenas uma vez quando a classe é carregada. • Se houver mais que um bloco estático, eles são executados na ordem que aparecem na classe. Exercícios 1. Defina uma classe chamada Matemática com dois métodos estáticos: um método chamado maior(int x, int y) que retorna o valor do maior parâmetro e outro método chamado menor(int x, int y). 2. Crie uma classe Compara onde o usuário informa dois valores e o programa mostra o valor maior e o menor usando os métodos da classe Matemática do exercício anterior. Dados e métodos OO • • • • • Um sistema OO consiste de objetos Objetos são criados a partir das classes Os atributos são definidos por variáveis O comportamento é definido pelos métodos Os objetos da mesma classe tem as mesmas características, mas cada objeto é diferente Orientados a Objetos public class Carro { String cor; String modelo; public Carro (String cor, String modelo) { this.cor = cor; this.modelo = modelo; } public void mostra( ) { System.out.println ("Isto é um " + modelo + cor + "."); } } Orientados a Objetos Car vectra = new Car("Branco","Vectra"); Car corsa = new Car("Prata","Corsa"); A orientação a objetos é ilustrada pelo fato que ambos os objetos têm dados separados, embora ambos sejam carros. vectra.mostra( ) imprimirá "Isto é um Vectra Branco." corsa.mostra( ) imprimirá "Isto é um Corsa Prata." Classes final • Um classe final não pode ser extendida • Não podemos declarar uma subclasse para uma classe final public final class Caixa { ... } public class Caixa2 extends Caixa { //ilegal Métodos final • Um método final de uma classe não pode ser sobrescrito nas suas subclasses • Segurança • Otimização public class Folha { public final double calculaSalario() {...} } public class FolhaModificada extends Folha{ public double calculaSalario(){...}//ilegal } Variáveis final • Uma variável final é uma constante • Qualquer tentativa de mudar o valor causa erro public final int CODIGO_BRASIL = 55; Classes Abstratas • Uma classe abstrata define apenas parte da implementação • Não podemos criar objetos para uma classe abstrata • Deixamos as subclasses fornecerem a implementação que falta da classe abstrata Classes Abstratas public abstract class PecaXadrez { public abstract boolean movimentoValido(int x, int y); public void move(int x, int y) { if (movimentoValido(x,y)) { // faz movimento } else { // erro } } } A classe PecaXadrez declara a existência do método movimentoValido mas não o implementa. Classes Abstratas Subclasses de classes abstratas têm que implementar todos os métodos abstratos declarados na classe pai. Caso contrário elas também serão classes abstratas. public class Rainha extends PecaXadrez { public boolean movimentoValido(int x, int // faz consistência do movimento para a } } public class Rei extends PecaXadrez { public boolean movimentoValido(int x, int // faz consistência do movimento para o } } y){ Rainha y){ Rei Exercícios 1. Defina uma classe Conta com os métodos saque e deposito (iguais ao da classe Conta Simples) e um método abstrato chamado boolean temSaldo(double valor). Redefina a classe ContaSimples com relacionamento de herança com a classe Conta. Implemente o código do método temSaldo na classe ContaSimples. Interfaces • Uma interface não tem implementação, todos os métodos são abstratos. • Uma interface pode definir variáveis estáticas do tipo final (constantes) public interface Cor { public int getCor( ); public void setCor(int cor); } Múltiplas Interfaces • A classe pode estender apenas uma classe, mas implementar múltiplas interfaces Interfaces • A classe que implementa uma interface deve definir os métodos da interface interface ObjetoSeguro { void abre(int segredo ); } class Cofre implements ObjetoSeguro { void abre(int segredo ) { if (segredo == 1234) { System.out.println("Cofre Aberto"); } } } Exercícios 1. Defina uma interface chamada Bancaria, tendo três métodos: deposito, saque e mostraSaldo. 2. Redefina a classe, Conta.java, usando a interface Bancaria para definir tipos de contas diferentes. Controle de Acesso • Java tem quatro níveis de acesso: – – – – public protected Default (quando é omitido) private Controle de Acesso Comparação • Operador == compara tipos primitivos • O método equals compara objetos toString • O método toString() faz parte de todos os objetos em java por ser um método da classe Object • Sobrescrevendo o comportamento deste método podemos definir uma representação de um objeto como uma String toString class Ponto { int x, y; public String toString() { return "Ponto(" + x + "," + y + ")"; } } Classes Internas • Uma classe interna é uma definição de classe dentro de outra classe • Defina uma classe como classe interna se ela não tem utilidade fora da classe que a contém. Classes Wrappers • Uma classe wrapper é uma representação de um tipo primitivo como um objeto • Cada tipo primitivo possui seu wrapper • Wrapper são úteis se você trabalha com classes e métodos que só aceitam objetos como argumentos Wrappers int pInt = 500; Integer wInt = new Integer(pInt); int p2 = wInt.IntValue( ); Exercício 1. Crie uma classe chamada SistemaSolar. No SistemaSolar crie a classe interna chamada Planeta com os atributos nome e distanciaDoSol. Defina um array de Planeta para o SistemaSolar. No construtor de SistemaSolar defina objetos para o array. Crie o método mostrePlanetas para o SistemaSolar. No método main crie um objeto da classe SistemaSolar e chame o método mostrePlanetas. Exceções • Mecanismo para tratar os erros durante a execução do programa. • Exceções são classes que representam erros durante a execução de um programa java. • Os objetos que representam as exceções podem ser “lançados”, capturados e manipulados. Condições de Erro • Tentar abrir um arquivo que não existe • Tentar usar uma conexão de rede interrompida • Tentar acessar posição de arrays fora da faixa • Tentar carregar uma classe que não está no classpath Exemplo public class Semaforo { public static void main (String args[ ]) { int i = 0; String semaforo [ ] = {"Verde", "Amarelo","Vermelho"}; while (i < 4) { System.out.println (sinais[i]); i++; } } } Ao executar o resultado é java Semaforo Verde Amarelo Vermelho java.lang.ArrayIndexOutOfBoundsException: 3 at Semaforo.main(Semaforo.java:12) Instruções try e catch Conta c = new Conta(); try { c.saque(100); } catch (EstouroSaqueException e) { System.out.println("Erro: " + e.getMessage() ); } c.mostraSaldo(); Aplicando o try/catch public class Semaforo { public static void main (String args[ ]) { int i = 0; String semaforo [ ] = {"Verde", "Amarelo","Vermelho"}; while (i < 4) { try { System.out.println (sinais[i]); catch (Exception e) { break; } i++; } } } Instrução finally A instrução finally define um bloco de código que sempre será executado, mesmo que uma exceção seja lançada ou não: boolean transacaoOk = false; try { abreTransacao( ); debito.saque ( valor ); credito.deposito( valor ); transacaoOk = true; } finally { if ( transacaoOk ) fechaTransacao( ); else desfazTransacao( ); } Instrução throw e clausula throws public void deposito(double valor) throws DepositoInvalidoException { if (valor > 0) { saldo = saldo + valor; } else { throw new DepositoInvalidoException("Este valor é invalido para depósito: " + valor); } } Categorias de Exceção • Throwable – Error – Exception • RuntimeException Tratar ou lançar? • O tratamento de exceções pode ser de 2 modos: • Tratar dentro do próprio método usando try,catch e finally • Lançar para quem chamou o método onde a exceção foi gerada usando a clausula throws Criando Exceções public class DepositoInvalidoException extends Exception { public DepositoInvalidoException (String motivo) { // chama construtor da classe pai super(motivo); } } Exercício 1.Crie as seguintes exceções no pacote erros: a. EstouroSaqueException - Acontece quando é feita uma tentativa de tirar mais dinheiro do que a conta possui. b. DepositoInvalidoException – Acontece quando uma quantia inválida de dinheiro (quantia < zero) é depositada. 2.Reescreva as operações de saque e depósito para lançar estas exceções. Calendário e Datas • A classe java.util.Date representa uma data e a classe java.util.Calendar representa um calendário para trabalhar com as datas. • Date hoje = new Date(); • Calendar c = Calendar.getInstance(); Formatando Datas • Para formatar datas em java use a classe java.text.SimpleDateFormat. Esta classe possui dois métodos básicos: parse(String) para converter um texto em uma data e format(Date) para formatar a data em um texto. Por exemplo: SimpleDateFormat sdf = new SimpleDateFormat("dd/MM/yyyy HH:mm"); String texto = sdf.format(new Date()); Date dia = sdf.parse("16/06/1971 23:00"); Calculando Datas • A classe Calendar permite a definição de data com o método set e o cálculo de datas com o método add(int, int). Por exemplo: Coleções • O java tem um framework de coleções que inclui listas, conjuntos e mapas. As operações básicas ao usar as coleções são: – – – – – adicionar objetos remover objetos verificar se existe um objeto recuperar um objeto percorrer os objetos um a um Principais Interfaces • As coleções se dividem em três categorias básicas: • Listas: Listas de objetos • Set: Conjuntos de objetos únicos • Maps: Objetos com uma identificação única • Coleções Ordered e Sorted Principais Métodos • List: add(Object value), get(int i) • Set: add(Object value), contains(Object) • Map: put(Object key, Object value) e get(Object key) Exercícios 1. Crie uma classe chamada Agenda que guarde o nome e o telefone de pessoas como objetos String em um HashMap, adicione 5 nomes e telefones e depois mostre o telefone de uma das pessoas. 2. Cria uma classe chamada Equipes para armazenar nomes de equipes em um ArrayList. O programa deve pedir para o usuário digitar os nomes das equipes até o usuário digitar "fim". O programa então mostra os nomes das equipes digitados pelo usuário.