Solucionado (ver solução)
Solucionado
(ver solução)
6
respostas

Dúvida conceitual sobre Exceptions

Ainda não entendi direito para que servem as Exceptions, já que até agora me parece que um if/then poderia executar o mesmo papel e é muito mais fácil de entender. Afinal, por que usar exceptions e não um if/then que trate o erro? E quando vocês falam em "tratar" o erro, o que exatamente isto significa? Simplesmente imprimir o erro no console?

6 respostas

Não é possível tratar exception com if ou else. A idéia do exception é pegar o erro, no momento da ocorrência, e trata-lo conforme a necessidade. Por exemplo, se você estiver acessando um banco de dados, você não vai conseguir tratar por if, mas consegue preparar a sua classe/método para pegar esse erro, fazer alguma validação e não interromper o seu processo bruscamente, ou explodir esse erro na tela do usuário. Tem N formas de você tratar o exception e contorna-lo.

Acho que esta aula não está legal, deveria explicar melhor os conceitos (por exemplo, o que são exceptions checked e unchecked? ) pois está difícil de entender para quem não tem experiência com Java. Ainda por cima nesta aula o instrutor usa o comando "Super", que foi outra coisa que não ficou bem explicada nas aulas anteriores.

solução!

Adriano, existem muitos conceitos em Java que no primeiro momento são "ciência de foguetes" mas depois você vai ver que faz tanta lógica que vai dar risada de quando não entendia.

Vamos por partes:

  • Super: Esta palavra reservada é utilizada todas as vezes em que você tem uma classe que herda de outra classe ("extends") e em algum ponto do seu código você precisa por exemplo sobrescrever um método dessa classe pai em uma classe filha mas precisa ou quer que o código presente na classe pai também seja executado, nesse caso você utiliza uma chamada à "super()", assim ele vai executar o conteúdo do método da classe filha e também vai executar o conteúdo do método da classe pai. Lembrado que a chamada para super deve ser sempre a primeira instrução.

  • Checked Exceptions: São exceções que você é obrigado a tratar em seu código. Quando você deseja utilizar um método que lança uma Checked Exception (quando existe a cláusula "throws" ao final da declaração do método) você é obrigado a colocar esta invocação dentro de um bloco "try-catch".

  • Unchecked Exceptions: São exceções que você não é obrigado a utilizar um bloco "try-catch", mas caso uma exceção deste tipo seja lançada e não tratada ela "irá subir na pilha de execução" até chegar ao usuário, seja no console ou em tela no caso de uma aplicação web.

  • Conceito das exceções: Uma explicação de quando eu iniciei em Java e me lembro até hoje e que explica de forma fácil a coisa toda é pensar no seguinte: Existem coisas no seu código que podem dar errado e que estão fora do seu controle, por exemplo caso você se conecte em um banco de dados que pode estar fora do ar, seria uma situação que foge do controle da aplicação e que seria uma situação de emergência, concorda? Neste caso quando você for construir o método que se conecta nesse banco danado, você pode colocar uma Checked Exception indicando para um outro programador (ou você mesmo) que esta operação pode dar errado e que se der errado algo precisa ser feito, como por exemplo dar uma mensagem ao usuário informando que o banco de dados está indisponível ou tentando se conectar em outro banco de dados. As exceções não verificadas (Unchecked) são por conceito erros leves, onde o fato de não serem tratados não levaria a uma falha geral na aplicação, mas lembre-se que elas irão subir na pilha e uma hora serão exibidas no console ou em tela para o usuário da mesma forma. Existem coisas que não podem ser tratadas com if, por exemplo um caso de conexão com banco de dados, o erro só seria lançado/gerado/criado quando você tentasse se conectar. Lembre-se que If/Else foi criado para lidar com a lógica de negócio da aplicação, já os tratamentos de erros foram criados para lidarem com a execução do programa em si, são conceitos e finalidades distintas.

  • Tratamento de erros: Tratar os erros não significa simplesmente "cuspir uma mensagem no console", talvez no curso esteja sendo impresso algo no console apenas para simplificar o conteúdo, no mundo real tratar os erros em blocos try-catch significa tomar alguma ação para corrigir o problema ou dar uma saída adequada quando um erro acontecer. Quer um exemplo simples e prático? Vamos supor que você esteja construindo uma aplicação de vendas que quando é feito um pedido o sistema debita a quantidade do produto de uma tabela de estoque e gera o pedido em uma outra tabela de pedidos com aquele produto e quantidade, ambas as coisas precisam acontecer com sucesso, tanto a gravação na tabela de estoque quanto a gravação na tabela de pedidos. Se por acaso o método que gera o pedido na tabela de pedidos lançar uma exceção qualquer, dentro de um bloco try-catch você poderia por exemplo realizar a devolução da quantidade do produto ao estoque, isso seria "tratar o erro", caso contrário aquela quantidade que foi debitada do estoque se perderia para sempre no sistema, entende a importância de tratar as exceções e utilizar corretamente esse importante mecanismo de controle de fluxo de execução?

Espero ter ajudado um pouco com esse textão. Um livro que pode te ajudar a acompanhar esse curso é o livro "Use a Cabeça Java", pesquise na net, é um livro bem didático e gostoso de ler.

Um abraço, Bruno

Adendo:

Pense que as Unchecked Exceptions são erros inesperados, geralmente erros do programador, como a famosa "Nullpointer Exception", lançada quando você tenta realizar uma operação em uma variável que está nula e deveria ter algum valor. Já as Checked Exceptions são sinalizadores de pontos do seu código que são propensos à falhas como se conectar a um banco de dados que pode ou não estar acessível pela sua aplicação.

De qualquer forma, esse mecanismo de tratamento de erros é a sua chance de pegar algo de errado acontecendo com a sua aplicação e tomar uma atitude corretiva. Nos blocos try-catch você também pode capturar exceção Unchecked, mas como a natureza desse tipo de exceção (unchecked) é algo inesperado geralmente indica que algum ponto do código não está suficientemente bem estruturado como o caso de uma variável nula na hora errada.

Se você não tratar as Unchecked Exceptions elas irão interromper o fluxo da aplicação caso não sejam tratadas.

Bônus: Não confunda Exceções (Exceptions) com Erros (Errors), existe a classe Exception e a classe Error. Quando uma exceção é lançada você consegue capturar isso em um bloco try-catch e tratar o problema, quando é lançado um Error, a JVM é interrompida e a sua aplicação "cai". Um exemplo de error é o famoso "There is insufficient memory for the Java Runtime Environment to continue", isso é um erro e quando ocorre a aplicação é finalizada pela JVM, não é possível tratar em blocos try-catch.

Nossa Bruno, obrigado!!!! Sua explicação foi muito esclarecedora! Até o conceito de "tratar" a exception você explicou de forma clara. Sei que são dúvidas básicas, mas eu gosto de entender direito o que estou fazendo para depois não ficar preso a "decorebas". Muito obrigado!

Disponha Adriano! No que pudermos ajudar estamos aqui! Gostei da sua abordagem de entender as coisas ao invés de apenas decorar, continue assim que você vai longe nessa e em qualquer outra linguagem que você quiser aprender.