A throws Exception
declaração é uma maneira automatizada de controlar os métodos que podem lançar uma exceção por motivos previstos, mas inevitáveis. A declaração é normalmente específica sobre o tipo ou tipos de exceções que podem ser lançadas, como throws IOException
ou throws IOException, MyException
.
Todos nós temos ou iremos, eventualmente, escrever um código que pára inesperadamente e relata uma exceção devido a algo que não previmos antes de executar o programa, como divisão por zero ou índice fora dos limites. Como os erros não eram esperados pelo método, eles não puderam ser "capturados" e tratados com uma cláusula try catch. Quaisquer usuários desavisados do método também não saberiam dessa possibilidade e seus programas também parariam.
Quando o programador sabe que certos tipos de erros podem ocorrer, mas gostaria de lidar com essas exceções fora do método, o método pode "lançar" um ou mais tipos de exceções ao método de chamada em vez de tratá-los. Se o programador não declarasse que o método (poderia) lançar uma exceção (ou se Java não tivesse a capacidade de declará-la), o compilador não poderia saber e caberia ao futuro usuário do método saber sobre, capturar e manipular quaisquer exceções que o método possa lançar. Como os programas podem ter muitas camadas de métodos escritos por muitos programas diferentes, torna-se difícil (impossível) manter o controle de quais métodos podem lançar exceções.
Mesmo que o Java tenha a capacidade de declarar exceções, você ainda pode escrever um novo método com exceções não tratadas e não declaradas, e o Java irá compilá-lo e você pode executá-lo e esperar o melhor. O que o Java não permitirá que você faça é compilar seu novo método se ele usar um método que foi declarado como lançando exceção (ões), a menos que você trate a (s) exceção (ões) declarada (s) em seu método ou declare seu método como lançando o mesmo exceção (ões) ou se houver várias exceções, você pode manipular algumas e lançar o resto.
Quando um programador declara que o método lança um tipo específico de exceção, é apenas uma forma automatizada de avisar outros programadores usando o método de que uma exceção é possível. O programador pode então decidir tratar a exceção ou passar o aviso declarando o método de chamada como também lançando a mesma exceção. Uma vez que o compilador foi avisado que a exceção é possível neste novo método, ele pode verificar automaticamente se futuros chamadores do novo método tratam a exceção ou declaram-na e obrigam a que um ou outro aconteça.
O bom desse tipo de solução é que, quando o compilador relata, Error: Unhandled exception type java.io.IOException
ele fornece o arquivo e o número da linha do método que foi declarado para lançar a exceção. Você pode então escolher simplesmente passar a bola e declarar seu método também "lança IOException". Isso pode ser feito até o método principal, onde faria com que o programa parasse e relatasse a exceção ao usuário. No entanto, é melhor capturar a exceção e lidar com ela de uma maneira agradável, explicando ao usuário o que aconteceu e como corrigi-lo. Quando um método captura e trata a exceção, ele não precisa mais declarar a exceção. A bola pára por aí, por assim dizer.