Exceptions

setembro 14th, 2009 No comments »

Nesse artigo iremos discutir o significado de uma exceção em java, como funciona o mecanismo de tratamento de exceções, e iremos terminar o artigo listando as exceções mais comuns com as quais você pode se deparar durante o processo de aprendizado da linguagem Java.

O que é uma Exceção

O termo exceção é uma abreviação para a frase “evento excepcional”.

Uma exceção é um evento, que interrompe o fluxo normal das instruções de um programa. As exceções podem ocorrer por falhas de hardware, exaustão de recursos, por erros de lógica, ou quando ocorre violação das restrições da linguagem.

Quando dentro de um método ocorre um comportamento que requer o lançamento de uma exceção, como por exemplo a divisão por zero, a máquina virtual sinaliza esse erro para o programa, que poderá tratar a exceção, ou não.

Após o lançamento de uma exceção, a JVM tenta encontrar algo para lidar com a mesma. A pesquisa começa com o método em que o erro ocorreu e prossegue através da pilha de chamada na ordem inversa em que foram chamados os métodos. Quando é encontrado um manipulador apropriado, o sistema em tempo de execução passa a exceção para o manipulador. Um manipulador de exceção é considerado apropriado se o tipo do objeto de exceção lançado pela JVM corresponde ao tipo que pode ser manipulado pelo manipulador.

Como Funciona o Sistema de Exceções do Java

Um código na linguagem de programação Java válido deve interceptar ou especificar requisitos. Isso significa que código que pode lançar certas exceções deve ser fechado por uma das seguintes opções:

  • O bloco de instruções try que captura a exceção deve fornecer um manipulador de exceção para tratamento da mesma (bloco catch)
  • Um método que pode acionar uma exceção, deve fornecer uma cláusula throws que relaciona as exceções que podem ser lançadas durante a execução do método.

Qualquer código que não respeitar a regra “tratar ou declarar” não serão compilados.

Erros de Sintaxe e de Samântica

setembro 1st, 2009 No comments »

Erros de sintaxe e semantica ocorrem quando alguma restricão da lingugem é violada, como por exemplo a omissao do sinal “;” no final de uma linha de comando. Em uma situação assim, o compilador indica o tipo de erro, a linha onde o erro foi detectado e a posição do erro dentro do código. Logo abaixo você pode vê um erro causado pela omissão do sinal ponto e virgula (;) no fim de uma instrução:

testing.java:14: `;’ expected.
System.out.println(”Input has ” + count + ” chars.”)
^
1 error

Algumas vezes o compilador pode tentar adivinhar sua intenção e imprimir uma mensagem de erro não muito clara, ou múltiplas mensagens de erro, como se o erro se estendesse por várias linhas. No código abaixo foi omitido o sinal ponto e virgula (;) da linha em negrito:

while (System.in.read() != -1)
count++
System.out.println(”Input has ” + count + ” chars.”);

Enquanto processa o código, o compilador lança duas menssagens de erro:

testing.java:13: Invalid type expression.
count++
^
testing.java:14: Invalid declaration.
System.out.println(”Input has ” + count + ” chars.”);
^
2 errors

O compilador escreve 2 mensagens de erro porque ele não percebe que count++ é uma expressão independente de System.out.println(”Input has ” + count + ” chars.”). Sem o ponto e virgula o compilador não tem meios de saber onde uma expressão termina e outra começa;

outra ocasiao onde o compilador irá reclamar é se em algum momento da compilação do programa, ele perceber que voce esta tentando executar uma operacao semanticamente incorreta como por exemplo Por exemplo, se você tentar usar uma variável que não esteja inicializada:

testing.java:13: Variable count may not have been initialized.
count++
^
testing.java:14: Variable count may not have been initialized.
System.out.println(”Input has ” + count + ” chars.”);
^
2 errors

Variaveis

agosto 24th, 2009 No comments »

Toda variável representa na verdade uma posição na memória do seu computado e toda variável que você declara tem um tipo, um nome, um tamanho fixo( em Java, o tamanho de uma variável é fixo, assim, o numero de bytes que uma variavel ocupa na memória independe do valor que aqueles bytes irão representar para nós seres humanos) e um valor.

O Java possui basicamente dois tipos de variáveis: variáveis de tipo primitivo e variáveis de referencia. As variáveis de tipo primitivo são caracterizadas por guardar valores básicos como um inteiro (int), um flutuante (float)… Já uma variável de referência, como o próprio nome já diz, faz referência a um objeto. É importante salientar que uma referência de objeto não é um objeto, portando, a variável de referencia não guarda um objeto, e sim uma referencia de objeto. A referência de Objeto nada mais é que uma espécie de “número identificador (id)” que liga uma variável a seu respectivo objeto.

Diferente da maioria das linguagens de script como javascript e PHP, onde o tipo da variável muda dinamicamente ao longo da execução de um algoritmo, o Java é uma linguagem fortemente tipada, isso quer dizer que uma variável do tipo int não se transforma no tipo float a menos que a conversão seja feita explicitamente pelo programador. A regra basica para conversão de tipos primitivo é que o tipo “menor” poderá ser convertido em um tipo “maior” sem perda de dados, mas na conversão de um tipo maior para um tipo menor poderá ocorrer perda de dados. Quando nos referimos a tipo maior e tipo menor estamos nos referindo ao tamanho em bytes que uma variavel daquele tipo ocupa na memória.  A perda de dados ocorre toda vez que você converte uma variavel de um tipo com mais bytes para um tipo com menos bytes. Por exemplo, se eu seto uma variável para ser float e depois converto em um int, o valor que estava guardado na minha variável será truncado, se o valor da variavel original da variavel fosse 1.25, quando ela fosse transformada em um int, todos os valores que estivessem depois do ponto seriam perdidos pois uma variavel int não suporta os bytes referentes a essas casas decimais.

Veja a seguir a lista com as variáveis primitivas do Java com seus respectivos tamanhos:

Variáveis Numéricas Inteiras

  • byte - Tamanho de 8 bits com sinal. Valores de – 128 a + 127.
  • short - Tamanho de 16 bits com sinal. Valores de – 32.768 a + 32.767.
  • int - Tamanho de 32 bits com sinal. Valores de – 2.147.483.648 a + 2.147.483.647.
  • long - Tamanho de 64 bits com sinal. Valores de – 9.223.372.036.854.775.808 a + 9.223.372.036.854.775.807.

Variáveis de Ponto Flutuante

  • float - Tamanho de 32 bits com sinal. Valores de – 1.40239846E-45 a + 3.40282347E + 38 (com nove dígitos significativos de precisão).
  • double - Tamanho de 64 bits com sinal. Valores de – 4.94065645841246544E-324 a + 1.79769313486231570E + 308 (com 18 dígitos significativos de precisão).

Variável de Caractere

  • char - Caractere Unicode com tamanho 16 bits sem sinal. Valores possíveis 0 a 65535.

Variável Booleana

  • boolean - Valor indicando true ou false. Tamanho de 8 bit.

A sintaxe de declaração de uma variável de tipo primitivo em java é bastante simples, veja o exemplo a seguir:

int valor = 1;

Na expressão acima uma variável do tipo inteiro (int) é criada e logo depois o valor 1 é atribuído a ela. Lembrando que o ponto e virgula no java é obrigatório, e indica o fim de uma expressão.

No exemplo acima nós definimos um valor inicial para nossa variável logo na sua declaração, mas você pode desejar não atribuir um valor inicial a variavel. Nesse caso, o java atribui o valor padrão de cada tipo de variável, se por exemplo você declarar uma variável do tipo int sem atribuir valor a mesma, o java irá atribuir o valor 0 à variável, se a variável for uma variável instância, o java atribui null à nova variável, se for a variavel de tipo primitivo boolean,  o valor padrão será false, e assim por diante. A sintaxe para definir uma variável sem atribuição de valor é a seguinte:

int valor;

Como foi mencionado anteriormente o java possui variáveis de tipo primitivo e variáveis de instância. As variáveis de instância não recebem valores simples como números inteiros ou números de ponto flutuante, mas recebem um valor de referência que representa a posição de um objeto na memória. Uma referência é uma espécie de link que permite que o programador possa acessar os metodos do objeto. Assim, um objeto na memória que não esteja referenciado por alguma variável não pode ser acessado pelo programador. Veja abaixo o exemplo a seguir da criação de um objeto básico em Java:

Object objetoDeTeste = new Object();

A palavra Object é o tipo da variável. O nome da variável é objetoDeTeste. A expressão new Object() cria um novo objeto na memória do computador, até aqui não existe nenhuma variável referenciando nosso novo objeto. Quando finalmente inserimos a expressão de atribuição “=”, a a variável objetoDeTeste passa a referenciar nosso objeto criado. Uma observação importante: O Java irá eliminar da memória do computador todo objeto que não tiver pelomenos uma variavel o referenciando. Outra observação é que o processo de eliminação de um objeto não é instantâneo, ele é executado pelo “coletor de lixo” (garbage colector).

O java possui oito tipos primitivos: boolean, char, byte, short, int, long, float e double; e “infinitos” tipos de referência! Quando dizemos que o Java possui “Infinitos” tipos de referência é porque novos tipos podem ser criados a qualquer momento. Toda vez que você cria uma nova classe ou interface você estará criando novo tipo que poderá ser o tipo que uma variável de referência irá referenciar.

Erros Comuns ao Tentar Compilar Arquivo Java

agosto 24th, 2009 No comments »

'javac' is not recognized as an internal or external command, operable program or batch file.

Esse erro ocorre a nível de sistema operacional, ou seja, ele não é emitido pelo compilador javac. Ele indica que o comando javac é inválido para o Windows, nesse caso, é como se o compilador java não estivesse instalado no seu computador. Caso você não tenha instalado o kit de desenvolvimento Java JDK, instale-o.

Depois que o JDK está instalado no sistema operacional você deve mostrar a ele onde o compilador está localizado, caso contrário ele irá se comportar como se você não tivesse instalado o compilador. Existem duas maneiras de fazer isso. Uma é configurando a variável de ambiente PATH, a outra é precedendo o comando javac com o caminho de diretórios que representa a localização do compilador no seu computador (pasta bin do seu JDK).

Suponhamos que você instalou o JDK em C:\jdk6 e deseja compilar um arquivo java chamado OlaMundo.java. Primeiro você deve iniciar o prompt de comando, depois vá ao diretório onde seu programa Java está localizado, depois escreva no prompt a seguinte linha de comando: C:\jdk6\bin\ javac OlaMundo.java.

C:\jdk6\bin\ é o diretório onde o compilador (e muitos outros programas do JDK) está(ão) localizado(s). Javac é o programa que queremos executar e OlaMundo.java é o arquivo que desejamos compilar

Como mencionado anteriormente, a outra maneira de mostrar ao Windows onde o compilador está localizado é configurando a variável de ambiente PATH. Antes de mostrar como configurá-la, vamos dar a você uma brave noção a respeito das variáveis de ambiente.

Entenda as variáveis de ambiente como variáveis do seu sistema operacional que podem ser configuradas por você. Elas servem para guardar strings que representam caminhos de diretórios importantes do seu sistema operacional. A variável PATH é utilizada como referencia para busca em todo o sistema, é baseado no PATH que o prompt irá verificar se um determinado comando esta disponível ou não. Depois que adicionarmos à string da variável PATH o caminho da pasta bin do JDK, o windows irá reconhecer o comando javac sem precisar escrever atentes o endereço da pasta bin. Dessa forma, nosso comando ficaria assim: javac OlaMundo.java em vez de C:\jdk6\bin\ javac OlaMundo.java.

javac: Command not found.

O erro acima indica que o Linux não conseguiu achar o compilador javac. Em resumo, é o mesmo problema que ocorre no Windows quando a variável PATH não está devidamente configurada e você tenta executar o compilador sem indicar antes do comando javac o diretório onde o compilador java está localizado.

Class names, ‘OlaMundo’, are only accepted if annotation processing is explicitly requested.

A mensagem acima é emitida pelo compilador quando você esquece de incluir a extensão .java no nome do arquivo a ser compilado. A mensagem é a mesma tanto no Windows como no Linux.

Lembre-se, o comando para compilar javac requer que você indique explicitamente a extensão do arquivo .java junto com o nome do arquivo. Por exemplo: javac OlaMundo.java

Classes e Objetos

agosto 14th, 2009 No comments »

Classes e objetos são a base de toda linguagem orientada a objetos. Você não poderá dominar a linguagem Java enquanto os conceitos de objetos e classes não estiver claro em sua mente. Mas afinal o que é um objeto? Classe é a mesma coisa que objeto? Nós tentaremos esclarecer essas e outras dúvidas a respeito do tema.

A principio, você pode imaginar um objeto como um “mini programa” que irá provê serviços úteis a uma aplicação com um propósito mais amplo. O conceito de objetos em Java é semelhante ao conceito de objetos (ou coisas) do mundo real. Portanto, assim como um objeto do mundo real possui características e comportamentos, os objetos Java também possuirão características (ou estados) e comportamentos (ou ações).

Em termos técnicos, os comportamentos dos objetos são conhecidos como métodos e as características como atributos. Se por exemplo nós instanciarmos um objeto do tipo Cliente para uma aplicação empresarial nosso objeto cliente poderá ter os atributos “nome”, “endereço”, “CPF”…  e comportamentos como “retornar nome”, “retornar CPF”, “alterar endereço”, e etc.

Agora vamos nos aprofundar um pouco mais no assunto… Para começar, você deve saber que você nunca poderá criar objetos, mas poderá pedir ao Java que crie um sempre que desejar! Confuso? Vou explicar melhor: Quando você instancia um novo objeto em Java, é como se você estivesse falando para a JVM: “JVM, por favor, crie pra mim um objeto do tipo X e referencie a variável xyz para o novo objeto que você irá criar”. Assim, “quem coloca a mão na massa” e cria o objeto é a JVM e não nós!

Quando você diz para a JVM “crie um objeto do tipo X”, você está dizendo para ela que instancie um novo objeto a partir de uma classe de nome “X”. A JVM irá localizar a classe indicada por você para que depois de localizada, a nossa classe “X” seja usada pela JVM como “receita” para criar nosso objeto. Portanto, uma Classe em Java nada mais é do que a especificação de um tipo de objeto, uma espécie de “receita” que a JVM usa para instanciar os objetos.

Depois de compreendido a mecânica da criação de objetos, vamos ver como podemos criar nossas próprias classes, já que sem as classes não poderemos instanciar os objetos. Pra melhor compreender esse tópico iremos criar um pequeno tutorial, onde será mostrado o processo de criação de uma classe Cliente.

Como já foi mencionada anteriormente, Uma classe deve definir os comportamentos e os atributos que os objetos criados a partir da classe deverão ter. Vale lembrar também que toda nova classe que criamos, estamos criando um novo tipo.