Propaganda
Uma exceção na programação significa uma condição excepcional em algum momento da execução do programa. É usado quando a condição excepcional pode ser tratada melhor em outro lugar do que onde é encontrada. Considere os seguintes exemplos:
- A falha em abrir um arquivo de configuração pode ser mais bem tratada no código, talvez usando um local de arquivo de configuração alternativo.
- Acessando um item da matriz Como usar um Java ArrayListUm Java arraylist é um array redimensionável de uso geral. Ele fornece a maioria dos recursos geralmente esperados para matrizes em outros idiomas. Neste artigo, você aprenderá a configurar e usar uma lista de matrizes. consulte Mais informação fora dos limites da matriz significa um erro no programa. Feliz depuração!
- Um erro de análise XML deve ser levado ao aviso do usuário para que o arquivo XML possa ser corrigido.
- O programa que está ficando sem memória (talvez ao processar um arquivo grande) pode ser corrigido aumentando talvez a quantidade de memória disponível para o processo java.
Em todos esses casos (e mais), a exceção deve ser tratada fora do local em que é gerada, para que a causa subjacente possa ser tratada.
Tipos de Exceções
A imagem abaixo mostra as principais partes da Hierarquia de Exceção Java. A classe base é Jogável que é subclassificado em Exceção e Erro. Classe Exceção é para condições relacionadas ao programa que os aplicativos podem capturar na tentativa de recuperar a situação. Classe Erro, por outro lado, é para indicar erros graves no Java Run-time Environment que aplicativos não devem capturar. Alguns exemplos são: Erro de falta de memória e StackOverflowError.
A Exceção novamente é de dois tipos: marcado e desmarcado. Uma exceção verificada deve ser tratada pelo código de chamada. Esta regra é imposta pelo compilador java. Uma exceção não verificada, por outro lado, pode ser propagada na cadeia de chamadas sem precisar declará-la explicitamente. Os exemplos abaixo esclarecerão.
Exceções verificadas
O método a seguir tenta criar FileReader de um arquivo. O construtor lança uma exceção verificada FileNotFoundException que deve ser tratado pelo código de chamada ou declarado para ser lançado.
O código a seguir será não compilar, uma vez que não.
private void loadFile (nome do arquivo String) {FileReader in = novo FileReader (nome do arquivo); }
Uma maneira de compilar o código é lidar com a exceção (veja abaixo).
private void loadFile (nome do arquivo String) {try {FileReader in = new FileReader (nome do arquivo)); {} catch (FileNotFoundException ex) {// manipula a exceção aqui} }
Se a exceção não puder ser tratada diretamente pelo chamador, ela deverá ser declarada na assinatura do método.
private void loadFile (nome do arquivo String) lança java.io. FileNotFoundException. {FileReader in = novo FileReader (nome do arquivo)); { }
Exceções não verificadas
Uma exceção desmarcada é aquela que é subclassificada de Exceção de tempo de execução e não precisa ser tratado diretamente ou declarado como acima. Por exemplo, o código a seguir resulta em um Null Pointer Exception, que é um tipo de Exceção de tempo de execução. O código, no entanto, compila sem erros desde Null Pointer Exception é uma exceção desmarcada.
private void handleEvent () {Nome da string = nulo; if (name.length ()> 0) {} }
Quebrando exceções
Dada a discussão acima sobre exceções verificadas e não verificadas, parece que é mais fácil lidar com exceções não verificadas, pois você não precisa declará-las ou manipulá-las. Com essa conveniência em mente, às vezes pode ser útil agrupar uma exceção verificada em uma exceção não verificada.
O exemplo de código a seguir mostra como quebrar uma exceção. O método Método 1() lança um SQLException em seu corpo. Para que o código seja compilado corretamente, a exceção deve ser declarada como lançada.
private void method_1 () lança SQLException {... lançar novo SQLException; }
Quando esse método é chamado de outro método (method_2 ()), esse método pode capturar o SQLException e envolva-o em uma exceção desmarcada, para que ele não precise declarar a exceção em sua assinatura de método.
método nulo privado_2 () {try {method_1 (); } captura (java.sql. SQLException ex) {lança nova RuntimeException (ex); } }
Rastreio de pilha de exceção
Um rastreamento de pilha de exceção refere-se à matriz de quadros de pilha ativos, cada um dos quais representa uma chamada de método, capturada pela JVM no momento em que a exceção foi lançada. Cada quadro de pilha inclui o local da chamada do método, incluindo o nome da classe, o nome do método e, possivelmente, o nome do arquivo de origem java e o número da linha no arquivo. É útil para rastrear a sequência de chamadas que causou o erro Exceções de Java: você está lidando com elas corretamente?Uma exceção na programação significa uma condição excepcional na execução do programa. É usado quando a condição pode ser tratada melhor em outro lugar. Considere os seguintes exemplos de manipulação de exceção Java. consulte Mais informação .
Aqui está um rastreamento de pilha típico, obtido do objeto de exceção quando ele foi capturado.
Exceção no encadeamento "main" java.lang. IndexOutOfBoundsException: Índice: 8, Tamanho: 5 em java.util. ArrayList.rangeCheck (ArrayList.java: 653) em java.util. ArrayList.get (ArrayList.java: 429) em sample.sample1.main (sample1.java: 24)
A exceção capturada aqui é IndexOutOfBoundsException. Inclui informações adicionais sobre o erro. O rastreamento de pilha contém 3 quadros de pilha, cada um dos quais inclui as informações de localização, como mostrado.
Tratamento de exceções
Uma exceção pode ser tratada capturando-a em um try-catch bloquear e executar qualquer ação corretiva necessária. o Exceção O objeto fornece vários métodos para extrair informações sobre a condição que o causou.
O código a seguir registra a mensagem de erro em um arquivo de log.
private void loadConfig () {try {// invoca o código que pode gerar uma captura IOException} (java.io. IOException ex) {// manipula a exceção aqui. Pode ser log para um arquivo de log. log.warning (ex.getMessage ()); } }
Quando uma exceção é quebrada dentro de outra, você pode recuperar a exceção quebrada:
Causa jogável = ex.getCause (); log.warning ("Causa subjacente:" + cause.getMessage ());
Você precisa acessar o rastreamento de pilha e talvez extrair o nome do método que o causou?
StringBuilder sbuf = new StringBuilder ("Rastreamento de pilha:"); para (StackTraceElement el: ex.getStackTrace ()) {sbuf.append (el.getClassName () + "." + el.getMethodName ()). append ("\ n"); } log.warning (sbuf.toString ());
Ou talvez, registre a exceção e repita-a?
tentar {... } captura (java.io. IOException ex) {log.warning (ex.getMessage ()); jogar ex; }
o Exceção classe fornece uma printStackTrace () método que pode imprimir o rastreamento de pilha para seu próprio PrintStream (ou PrintWriter).
tentar {... } captura (java.io. IOException ex) {PrintStream out =...; out.println (ex.getMessage ()); ex.printStackTrace (sai); }
Você pode capturar vários tipos de exceções em um único tentar bloquear e executar tratamento específico para cada tipo de exceção.
tente {// lança algumas exceções aqui. } captura (java.io. IOException ex) {// manipulação específica de IOException aqui. } captura (java.sql. SQLException ex) {// manipulação específica de SQLException aqui. }
Para capturar vários tipos de exceção, mas usar o mesmo código de manipulação, você pode declarar um pegar bloco com vários tipos, da seguinte maneira:
tente {// lança algumas exceções aqui. } captura (java.io. IOException | java.sql. SQLException ex) {// manipulação específica de IOException e SQLException aqui. } catch (SAXException ex) {// manipulação específica de SAXException aqui. }
Limpando Recursos Com Finalmente
Ao lidar com código que pode gerar exceções, é essencial executar a limpeza adequada de todos os recursos, como arquivos abertos Tudo o que você precisa saber sobre os formatos de arquivo e suas propriedadesUsamos o arquivo de palavras de forma intercambiável: música, imagem, planilha, apresentação de slides e assim por diante. Mas o que faz de um arquivo um "arquivo", afinal? Vamos tentar entender essa parte fundamental da computação. consulte Mais informação , conexões com o banco de dados etc. A limpeza de recursos deve ser realizada em um finalmente quadra. Dessa forma, a saída normal e a saída excepcional de um bloco invocam o código de limpeza Os 10 piores erros de programação da históriaEm seu passado histórico, a codificação também causava destruição. Instâncias de um pouco de código incorreto causaram desastres em um nível principal. A seguir, são 10 dos piores erros de programação da história. consulte Mais informação .
InputStream in = null; tentar {... in = novo FileInputStream (nome do arquivo);... } captura (java.io. IOException ex) {log.warning (ex.getMessage ()); } finalmente {// o código aqui é executado ao sair do bloco try, // normalmente ou devido a uma exceção if (in! = null) in.close (); }
Bloco Try-With-Resources
O Java 1.7 introduziu o tente com recursos construção que facilita a limpeza de recursos. Se parece com isso:
try (InputStream in = new FileInputStream (..)) {// código que usa o InputStream. }
Quando o código sai do bloco (seja de forma limpa ou devido a uma exceção), o InputStream A variável é limpa automaticamente.
Limpe vários recursos declarando todos eles na cabeça do bloco.
try (InputStream in = novo FileInputStream (..); Conexão con =...; ) {// código que usa o InputStream e a conexão. }
Qualquer objeto cuja classe implementa o AutoCloseable A interface pode ser limpa dessa maneira. A classe a seguir executa uma limpeza específica no diretório Fechar() método.
public class MyClass implementa o AutoCloseable {public void close () {// código de limpeza aqui} }
Use uma instância desta classe em um tente com recursos quadra.
try (MyClass obj = new MyClass (..)) {// código que usa o objeto MyClass. }
Algumas exceções comumente encontradas
Vamos agora dar uma olhada em algumas exceções comumente encontradas.
- IndexOutOfBoundsException (desmarcada): indica que o índice do elemento acessado está fora dos limites de uma matriz, sequência, etc.
- SQLException (marcado): lançado devido a um erro no banco de dados.
- IOException (marcado): erro de acesso ao arquivo ou erros relacionados à entrada e saída.
- InterruptedException (marcado): lançado quando uma execução de thread é interrompida.
- SAXException (marcado): lançado devido a erros de análise de XML.
- Null Pointer Exception (desmarcado): usando nulo onde um objeto é necessário.
Empacotando
Exceções são o método principal para relatório e gerenciamento de erros em Java. Uso adequado de exceções melhorar a qualidade do código Escreva ou codifique mais rapidamente no seu editor de texto do Linux com temas personalizadosSeu editor de texto do Linux não precisa parecer monótono e "funcional". Por que não ajustá-lo para aumentar sua produtividade, seja criando scripts e codificando ou usando a ferramenta como um editor de marcação? consulte Mais informação e ajuda na resolução de problemas na produção.
Você tem alguma história de guerra relacionada a exceções para relatar? Se assim for, conte-nos sobre isso na seção de comentários abaixo.
Crédito de imagem: Dmitry Nikolaev via Shutterstock.com