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.
instagram viewer

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.

Hierarquia de exceção

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