E na aula de hoje, vamos aprender sobre exceções. O que são exceções? Bem, são eventos excepcionais. É um evento que ocorre durante a execução de um programa. E o que isso faz é atrapalhar o fluxo normal das instruções do programa. E quando esse erro ocorre dentro de um método, o método cria um objeto, e o entrega ao sistema de tempo de execução. Esse objeto, que é chamado de objeto de exceção, contém informações sobre o erro, incluindo o tipo e o estado do programa quando ocorreu o erro. criando um objeto de exceção e manipulando-o para o sistema de tempo de execução, é conhecido como lançar a exceção. Nos velhos tempos, o programa produziria um dump do sistema de sua memória. Agora, depois que um método lança uma exceção, o sistema de tempo de execução tenta encontrar algo para lidar com isso. O conjunto de coisas possíveis para lidar com a exceção, é a lista ordenada de métodos que foram chamados, para obter o método onde ocorreu o erro. Por que usamos exceções? Bem, o que queremos fazer é separar o código de tratamento de erros do código normal. Exceções nos permitem separar os detalhes do que fazer quando algo fora do comum acontece, e separamos isso da lógica principal de um programa. Isso torna nosso código muito mais fácil de ler. Os tipos de exceções incluem, o que acontece se o arquivo estamos tentando abrir, não pode ser aberto? O que acontece se o comprimento de um arquivo não puder ser determinado? O que acontece se não houver memória suficiente para ser alocada? O que acontece se uma leitura falhar? O que acontece se o arquivo não puder ser fechado? Sem exceções, teríamos que misturar o código de tratamento de erros com o código que realmente executa a lógica do programa. Então abrimos o arquivo, se o arquivo abrir, então determinamos o comprimento do arquivo. Se o tamanho do arquivo for bom, então alocamos essa quantidade de memória. Se tivermos memória suficiente, lemos o arquivo. Como você pode ver, há tanta detecção de erros dentro do código, que o código fica longo, e difícil de seguir, com uma série de instruções if aninhadas. Quando há tanta verificação de erros dentro do código, perdemos a noção do fluxo lógico do código, e dificulta a depuração, e entender exatamente o que o código está fazendo. Podemos agrupar e diferenciar tipos de erros, e porque todas as exceções lançadas dentro de um programa são objetos, o agrupamento fica fácil, e é um resultado natural da hierarquia de classes que o Java construiu. Um método pode capturar uma exceção com base em seu grupo, ou tipo geral, especificando qualquer uma das exceções superclasses na instrução catch. E veremos a instrução try catch a seguir. Mas os manipuladores de exceção devem ser o mais específicos possível. Determinar o tipo de exceção, antes de decidir sobre a melhor estratégia de recuperação. Ao não capturar erros específicos, manipuladores devem acomodar qualquer possibilidade. E se tivermos manipuladores de exceção muito gerais, que pode tornar o código mais propenso a erros, capturando e manipulando exceções que não foram previstos pelo programador, e para isso o manipulador não foi destinado. Uma exceção é algum tipo de evento. Ocorre durante a execução do programa, e interrompe o fluxo normal do programa. Quando o erro ocorre, o método cria um objeto, e o entrega ao sistema de tempo de execução. Há um monte de coisas que acontecem nos bastidores, mas podemos lidar com essas exceções, e produzir alguma saída que explique o que acontece. Agora, há um monte de diferentes exceções possíveis, e podemos lidar com cada um deles, e o que vamos ver, é como lidar com a exceção que sabemos que pode acontecer. Exceções podem separar os detalhes do que fazer quando algo fora do comum acontece, e o mantém afastado da lógica principal do programa. E porque todas essas exceções são objetos, podemos agrupá-los ou categorizá-los, para que façam sentido. Quando escrevemos essas exceções, queremos ser o mais específicos possível. E vamos dar uma olhada exatamente do que estou falando. Vou rolar para baixo e aqui está o nosso programa. É um programa simples, eu crio um inteiro, chamado dividir por zero, e eu igualei a zero. Então eu tenho um bloco try catch, começando na linha 45. A ideia aqui é que antes de dividir por zero, vai testar para ver se a divisão vai funcionar. Se houver uma exceção aritmética, ele imprimirá a exceção aritmética, e uma mensagem do que eu estava tentando fazer. E então um bloco finalmente que diz: isso vai acontecer não importa o quê. Vamos executar este programa e ver o que acontece. Agora, na primeira vez que o executei, funcionou perfeitamente, porque minha divisão por zero é cinco dividido por um. O que acontece é que se eu mudar o um para zero, e tento dividir por zero, essa é a linha de código que vai gerar a exceção. O programa vai tentar fazer a divisão. Quando a exceção acontece, ele pega essa exceção aritmética, e, em seguida, imprime a mensagem. Vamos executá-lo e ver o que acontece. Tentamos dividir por zero, cinco dividido por zero. O programa pegou nosso erro e disse: a exceção aritmética por zero é o problema. E, finalmente, o bloco de código sempre é executado, e a variável dividir por zero não foi alterada. O que é importante saber aqui, é que o programa foi concluído com sucesso, e a impressão é o que precisa ser revisto para ver o que pode ter dado errado. Agora você sabe como as exceções podem ser tratadas antes que eles causem um problema em seu programa.