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
tryque captura a exceção deve fornecer um manipulador de exceção para tratamento da mesma (blococatch) - Um método que pode acionar uma exceção, deve fornecer uma cláusula
throwsque 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.
Classes e objetos são a base de toda linguagem orientada a objetos. Você não poderá dominar a linguagem Java ou qualquer outra linguagem OO(Orientada a Objetos) enquanto os conceitos de objetos e classes não estiverem claros 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.
Uma classe, como o nome já diz, refere-se a um grupo de coisas que têm características e comportamentos em comum. No mundo real por exemplo, temos a classe dos seres humanos e dos pássaros. Quando pensamos na classe ser humano, pensamos em características como nome, altura e capacidade de fazer coisas como pensar, andar e correr. Podemos aplicar o mesmo raciocínio para a classe dos pássaros, ou qualquer outra coisa que você imaginar, seja ela um objeto inanimado como um rádio ou um ser vivo como um ou um ser humano. Portanto, objetos de uma mesma classe possuem características e comportamentos em comum, não importa se o nome do ser humano é João ou Maria, ou se sua altura é 1,80m ou 2m eles vão continuar sendo seres humanos, são pessoas diferentes que pertencem à classe dos seres humanos.
Em programação orientada a objetos, o princípio de classe e objetos (ou coisas) é aplicado da mesma forma. Só tem um problema nisso tudo. O Java não sabe o que é um ser humano, Você vai ter que mostrar ao Java o que é um ser humano, você vai indicar ao Java quais as características e os comportamentos de um ser humano. E é aqui que a coisa fica legal!
Para continuarmos, é importante que você esteja por dentro de alguns termos técnicos do mundo OO:
- Os tipos são conhecidos como classe.
- As características dos objetos são conhecidas como atributos.
- Os comportamentos dos objetos são conhecidos como métodos.
- Instanciação é o ato de criação de um objeto.
Vamos à prática: vamos ensinar ao java quais os comportamentos e característica que um objeto pessoa deve ter:
//declarando o nome da classe (Pessoa)
class Pessoa{
//caracteristicas (atributos)
String nome;
//comportamentos (metodo)
String retornaNome(){
//retorna o nome da pessoa
return nome;
}
void defineNome(String novoNome){
//define o nome da pessoa
nome = novoNome;
}
}
Agora vamos ver na pratica como eu poderia criar um objeto do tipo Pessoa:
//criando variavel que vai receber um objeto do tipo pessoa
Pessoa p1 = null;
Pessoa p2 = null;
//instanciando novo objeto do tipo pessoa - new Pessoa()
p1 = new Pessoa();
p2 = new Pessoa();
//definindo nomes
p1.defineNome("Jose");
p2.defineNome("Maria");
//pegando os nomes das pessoas
p1.retornaNome() //Jose
p2.retornaNome() //Maria
A classe pessoa define os comportamentos e os atributos que os objetos do tipo Pessoa deverão ter. Depois, no segundo exemplo, nós instanciamos dois objetos do tipo pessoa. Depois de instanciados, chamamos os metodos de cada objeto criado para definir os seus nomes, o nome primeiro objeto (p1) foi definido como João e o segundo (p2) foi definido como Maria. E finalmente, nas duas ultimas linhas, foi chamado o método retornaNome(), que retorna o nome definido anteriormente.
Toda variável representa na verdade uma posição na memória do seu computado. Em Java, toda variável que você declara tem um tipo, um nome, um tamanho fixo (dizemos que o tamanho de uma variável é fixo porque 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) .
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.
Nesse artigo vecê vai conhecer alguns dos erros mais comuns que podem ocorrer ao tentar executar um bytecode.
Exception in thread “main” java.lang.NoClassDefFoundError: OlaMundo: A exceção acima é lançada quando o java não encontra um arquivo bytecode necessário para a execução de um programa. No exemplo acima, o java precisou do bytecode OlaMundo.class, mas não achou. O erro ocorreu por que o arquivo não existe ou não está no diretório correto.
Uma das tentativas do Java para encontrar o arquivo indicado é no diretório corrente, assim, se o bytecode não estiver no diretório corrente, você deve navegar até o diretório onde o bytecode está gravado.
Exception in thread “main” java.lang.NoClassDefFoundError: HelloWorldApp/class: Esse erro é disparado sempre que se tenta executar um programa java incluindo a extensão “.class” após o nome do bytecode. Se, por exemplo, você tentar executar o seu programa com java HelloWorldApp.class ao invés usar java HelloWorldApp, você irá se deparar com esse erro. Para executar uma classe, o argumento do comando java é o nome da classe que você quer usar, mas sem a extensão “.class” depois do nome do arquivo.
Exception in thread “main” java.lang.NoSuchMethodError: main: A JVM requer que você execute suas classes apartir de um método interno do java chamando método main, que tem a seguinte “aparência”: public static void main(String args[])). Toda aplicação java tem seu “start” nesse método, por isso, se você tentar iniciar uma aplicação java apartir de um arquivo de classe que não possui o esse método especial, o erro acima irá ocorrer.
Nesse artigo vecê vai conhecer alguns dos erros mais comuns que podem ocorrer ao tentar compilar um arquivo .java.
‘javac’ is not recognized as an internal or external command, operable program or batch file: Esse erro indica que o comando javac é inválido para o Windows, nesse caso, é como se o compilador do java não estivesse instalado no seu computador. Caso você não tenha instalado o kit de desenvolvimento Java JDK, instale-o. Se você já instalou o JDK na sua máquina, esse erro está ocorrendo porque o SO não conseguiu encontrar o diretorio bin do JDK. Nesse caso, você deve configurar a variável de ambiente PATH adicionando a pasta bin do JDK a essa variável.
As variáveis de ambiente 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.
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
Class names, ‘OlaMundo’, are only accepted if annotation processing is explicitly requested.:A mensagem acima é emitida quando o compilador nao encontra o arquivo a ser compilado no diretorio indicado. A mensagem é a mesma tanto no Windows como no Linux. É importante frisar que o comando javac requer que você indique explicitamente a extensão do arquivo .java junto com o nome do arquivo. Por exemplo: javac OlaMundo.java
Esse artigo é um breve tutorial de como fazer o seu primeiro “HelloWorld”, que irá mostrar no console do seu computador a mensagem Ola Mundo!.
Antes de tudo, é necessário ter Kit de Desenvolvimento Java (JDK) corretamente instalado e configurado em seu computador. Você pode encontrar instuções sobre a instalação e configuração do JDK nos links abaixo:
No Linux, http://www.guj.com.br/java.tutorial.artigo.14.1.guj
No Windows, http://www.guj.com.br/java.tutorial.artigo.12.1.guj
Depois de configurado, abra um editor de textos da sua preferência, como o bloco de notas (Win), notepad++ (Win) ou o gedit (linux).
Escreva o seguinte código no seu editor de texto:
class OlaMundo { //declaracao de classe
public static void main(String[] args) { //metodo main
System.out.println(“Ola Mundo!”); //mostra a mensagem.
}
}
Agora salve o arquivo criado na sua área de trabalho, salve o arquivo como OlaMundo.java. Tome o cuidado na hora de salvar o arquivo, certifique-se de que o arquivo seja salvo com extensão .java e não .txt.
Antes de Continuarmos, é necessário fazer uma observação importante: O Java é case sensitive, isto é, nomes de comandos, variaveis, nomes de arquivos, etc, devem ser escritos considerando que o Java diferencia letras maiúsculas e minúsculas. Chamar meu arquivo de olamundo é diferente de chamá-lo de Olamundo, que é diferente de OlaMundo.
Com o shell de comando do seu sistema operacional aberto, você irá mudar o diretório atual do shell para o diretório em que você salvou seu arquivo .java – nesse tuturial vamos usar o diretorio da área de trabalho. Depois de selecionado o diretório, já podemos compilar nosso arquivo-fonte: Para compilar o arquivo OlaMundo.java você irá escrever o seguinte comando no shell: javac OlaMundo.java.
O comando acima irá gerar o arquivo bytecode OlaMundo.class. Agora que você tem o arquivo .class você pode rodar seu programa.
No mesmo diretório, insira o seginte comando no prompt: java OlaMundo.
O comando java irá chamar uma instância da JVM para rodar os bytecodes gerados pelo compilador do java, o javac.
Observação importante: O nome OlaMundo do comando java se refere ao .class gerado pelo compilador, e nesse caso, você NÃO DEVE usar a extensão .class para referir-se aos bytecodes.
A Linguagem de Programação Java
Em um programa feito em Java, primeiramente o código fonte é escrito em um
arquivo de texto sem formatação, a extensão do arquivo de texto deve ser .java.
O arquivos de texto são compilados em arquivos .class pelo compilador javac.
O arquivo .class gerado pelo compilador não contém o código binário nativo do seu processasor,
ele contém bytecodes – A linguagem de máquina nativa da JVM.
Devido a JVM está disponível em muitos sistema operacionais, um arquivo .class
funciona tanto no Windows como no Solaris, Linux e no Mac. Algumas máquinas virtuais, tais como a maquina
virtual Java HotSpot, executam etapas adicionais no tempo de execução para melhorar o
desempenho da sua aplicação.
A Plataforma Java
Uma plataforma é o ambiente de hardware e software em que um programa funciona. Algumas das
plataforma mais populares já foram mencionadas anteriormente como o Windows o Mac, Solaris e Linux.
A maioria dessas plataformas podem ser descritas como uma combinação do sistema operacional com o hardware
da máquina sobre a qual ele roda. A plataforma de Java difere da maioria dessa plataformas nesse ponto
, ela possui apenas a camada de software, que funciona sobre essas plataformas baseadas em hardware.
A plataforma java é formada por dois componentes principais: A Java Virtual Machine e a API Java.
- A JVM – Java Virtual Machine é o coração da plataforma Java. É um software que roda sobre
seu sistema operacional simulando um computador – daí o nome Máquina Virtual Java. Quando um programa Java
é iniciado, para que este funcione, o java lança uma instância da JVM – Java Virtual Machine
que traduz osbytecodespara codigo binário que sua máquina entende.
Além de traduzir osbytecodes, a JVM é responsável por administrar os recursos
que o java aloca de sua máquina. - A API Java é uma grande coleção dos componentes de software pré-feitos que fornecem muitas capacidades úteis
para os programadores de Java. Ela é agrupada em bibliotecas para co-relacionar classes e Interfaces;
estas bibliotecas são conhecidas como pacotes.
A palavra API significa Application Programming Interface (ou Interface de Programação de Aplicativos).
