1.3 Quelques notions sur la diffusion de l’eau dans les silices
1.3.1 Mécanismes et modèles de diffusion d’eau au sein de la silice
Baseado no que já foi dito, existem três categorias de exceções na linguagem Java que devem ser entendidas para poderem ser melhor tratadas:
Exceções checadas (checked)
Esta exceção ocorre na hora da compilação e, por isso, também são conhecidas como exceções em tempo de compilação. Por meio do uso de um bom IDE, o compilador just in time do Java verificará que poderá ocorrer uma exceção deste tipo e impedirá a compilação do código. Se o programador estiver usando um editor de texto como o Sublime, o editor permitirá salvar o arquivo; porém, ao chamar o compilador (javac), o compilador gerará um erro de compilação e o programador terá de corrigir o código para poder ser compilado.
Vamos ao exemplo:
É comum usar a classe FileReader para ler um arquivo de texto. Esta classe possui vários métodos que leem um arquivo de texto e manipulam seus dados. No construtor, se um determinado arquivo não existe ocorrerá uma exceção chamada FileNotFoundException e o compilador avisará o programador que isso é um erro, e não compilará o programa.
Tente compilar o programa a seguir: import java.io.File;
import java.io.FileReader; public class Excecao1 {
public static void main(String args[]) { File file = new File("C://arquivo.txt");
FileReaderfr = new FileReader(file); }
}
O resultado da compilação será: C:\>javac Excecao1.java
FilenotFound_Demo.java:8: error: unreported exception FileNotFoundException; must be caught or declared to be thrown
O resultado acima é gerado quando se usa o compilador na linha de comando no Windows. Nos outros sistemas operacionais a mensagem será semelhante. O importante é notar que o código não será compilado.
Mas por que não será compilado? Como o compilador sabe distinguir isso? Neste caso específico, a classe FileReader possui dois métodos read() e close() que lançam a exceção IOException. E, sendo assim, o compilador saberá que ela precisará ser tratada já na compilação. Vamos entender o que é esse “lançar a exce- ção” um pouco mais à frente.
Exceções não checadas (Unchecked)
Este tipo de execução passa pela compilação mas pode ocorrer duran- te a execução do programa. São chamadas de exceções em tempo de execução, ou runtimeexceptions.
Por exemplo, uma divisão por zero pode ocorrer em uma expressão. Além dis- so pode ser um erro de programação ou mesmo uma forma errada de usar alguma classe ou método da API.
Vamos ao exemplo:
int num[] = {1, 2, 3, 4}; System.out.println(num[5]);
Qual é o erro desta parte do programa?
Aparentemente nenhum não é? Porém se você observar atentamente, a linha 2 está tentando acessar o 6º elemento do array. Só que ele não existe. Mas sintatica- mente as linhas estão corretas e isso não será barrado pelo compilador.
Porém, na execução, será gerada uma exceção chamada ArrayIndexOutOfBoundsException e interromperá a execução do programa. O duro é que, dependendo de onde estiver este código, o programa poderá ser exe- cutado milhões de vezes e nunca gerar o erro, mas dependendo do fluxo do pro- grama poderá gerar logo na primeira execução. Ou seja, o compilador não saberá desta exceção, somente a ação do programa é que gerará a exceção.
E na hora que isso ocorrer, o JRE simplesmente parará o programa e vai gerar a seguinte mensagem na tela:
Exception in thread "main" java.lang.ArrayIndexOutOfBoundsException: 5 at Exceptions.Teste.main(Teste.java:xxx)
Ou seja, não é nada agradável ler isso durante a execução de um programa. Se o usuário for um programador Java ele saberá o que houve, mas e se for um usuário comum?
Erros
O último tipo de exceção que podemos ter na classificação são os erros. Eles não são bem uma exceção mas sabemos que erros podem aparecer mesmo sem o controle do programador.
Os erros são simplesmente ignorados no código porque na prática você não tem muito o que fazer com os erros. Por exemplo: um estouro de pilha de exe- cução (stack overflow). Pode ocorrer a qualquer hora durante a execução de um programa, não será detectado pelo compilador tampouco será previsto pelo usuá- rio. Esse tipo de erro pode ocorrer quando o programa está executando em uma máquina com pouco recurso. Neste caso, infelizmente não temos como tratar em Java. Aliás, em nenhuma linguagem.
Vamos ver como o Java organiza isso.
Hierarquia de classes
A resposta para estes problemas em Java vem do mecanismo de tratamento de exceções. E como tudo em Java está baseado em classes e objetos, este mecanismo não poderia ser diferente.
Todas as exceções em Java são derivadas, ou seja são subclasses, da classe Exception do pacote java.lang. Por sua vez, esta é uma subclasse de Throwable, que tem como “irmã” a classe Error.
Os erros são condições anormais no fluxo de programa que ocorrem em falhas graves que não são planejadas pelo programador. Normalmente os programas não conseguem se recuperar quando um erro ocorre.
A classe Exception tem duas subclasses importantes: IOExceptione RunTimeException. Veja a hierarquia apresentada na figura 4.1.
Throwable Error IOException EOFException FileNotFound Exception MalformedURL Exception UnknownHost Exception ClassNot Found Exception CloseNot Supported Exception Runtime Exception Arithmetic Exception ClassCast Exception Illegal Argument Exception Illegal State Exception IndexOut OfBounds Exception NoSuch Element Exception NullPointer Exception Exception
Figura 4.1 – Hierarquia de exceções em Java. As classes marcadas em vermelho são ex- ceções checked e as azuis são as unchecked. Fonte: <https://docs.oracle.com/javase/7/ docs/api/java/lang/package-tree.html>.
Portanto, a subclasse Exception possui métodos que definem erros nos quais a aplicação consegue tratá-los e continuar sendo executada. A subclasse Error pos- sui métodos que definem os erros que não devem ser capturados pelas aplicações porque são erros graves e não possibilitam que a execução do programa conti- nue satisfatoriamente.
A seguir apresentamos uma lista com as subclasses da classe RuntimeException. Veja na figura 4.1 que estas exceções são derivadas de java.lang, logo, não precisam ser importadas nos seus programas. Lembra-se das exceções unchecked explicadas no início do capítulo? Veja a lista delas na tabela 4.1 e tabela 4.2. Todas as classes que estão vinculadas à classe RunTimeException são unchecked. As outras classes que não fazem parte da RunTimeException são checked.
Nas tabelas a seguir você vai encontrar termos que não abordamos ainda nem vamos abordar neste livro. Porém, conforme você prosseguir nos seus estudos em Java, você vai acabar se deparando com estes termos e talvez com estas exceções. Por exemplo, quando você criar aplicações envolvendo bancos de dados, será obri- gatório usar algumas classes de conexão com o banco de dados. Se estas clas- ses não estiverem presentes você receberá uma exceção de classe não encontrada (ClassNotFound). Outros termos como thread, estados etc. aparecerão nas tabe- las, mas não serão abordados aqui.
NÚMERO
EXCEÇÃO
BREVE DESCRIÇÃO
1
ArithmeticException Erro aritmético, por exemplo, divisão por zero2
ArrayIndexOutOfBoundsException Quando um índice de um array não existe e tenta ser acessado3
ArrayStoreException Atribuição para um element deum array de tipo incompatível
4
ClassCastException Cast (conversão de tipo)inválido
5
IllegalArgumentException Argumento ilegal usado para chamar um método6
IllegalMonitorStateExceptionOperação de monitoração ilegal, como o estado de espera em um thread desbloqueado.