9.4 Também podemos lançar exceções!
Nosso código também pode lançar uma exception caso algo inesperado aconteça. E não estou falando de lançar uma exception acidentalmente. Assim como um array dispara o ArrayIndexOutOfBoundsException quando fazemos algo inesperado (tentar acessar mais valores do que o array suporta), podemos fazer isso com nossas regras.
Um exemplo simples é na própria classe Livro, onde desde o início definimos que seria obrigatório passar um Autor como argumento. A regra é clara: não se pode ter um Livro sem Autor e, para garantir isso, criamos o construtor que obrigava a passagem desse parâmetro:
public Livro(Autor autor) { this.autor = autor;
this.isbn = 11000-00-00000-00-011;
}
Isso já é bem interessante, mas o grande problema é que ainda podemos
passar uma referência nula de Autor no momento em que criamos o livro, como:
Livro livro = new livroFisico(null);
Até poderíamos validar o valor passado para o construtor:
public Livro(Autor autor) {
if (autor == null) {
II o que fazer aqui?
}
this.autor = autor;
this.isbn = 11000-00-00000-00-011;
}
Mas o que poderia ser feito se o autor fosse null? Assim como a API do
Java, podemos lançar exceptions para casos como esse. Essa é uma forma mais robusta do que validar e retornar um boolean ou uma mensagem que pode simplesmente ser ignorada.
Veja como fica nosso código:
public Livro(Autor autor) {
if (autor null) {
throw new runtimeException();
}
this.autor autor;
this.isbn "000-00-00000-00-0";
}
Repare que a palavra reservada throw precede a exception que está
sendo disparada, neste caso uma RuntimeException. Há ainda a possibilidade de passar uma mensagem via construtor, comportamento presente na superclasse Exception:
public Livro(Autor autor) {
if (autor null) {
throw new runtimeException(
"□ Autor do Livro nao pode ser nulo");
}
this.autor autor;
this.isbn "000-00-00000-00-0";
}
A saída será:
Exception in thread "main" java.lang.RuntimeException:
□ Autor do Livro nao pode ser nulo at br.com.casadocodigo.
livraria.produtos.Livro.<init>(Livro.java:16) at br.com.casadocodigo.
livraria.produtos.LivroFisico.<init>(LivroFisico.java:9) at br.com.casadocodigo.
livraria.testes.RegistroDeVendas.main(RegistroDeVendas.java:16)
Criando sua própria Exception
No lugar de lançar uma RuntimeException, podemos criar uma exception bem específica para esse comportamento inesperado. Vamos criar a AutorNuloException!
Como fazer isso? Na verdade, é bem simples: assim como qualquer outra Exception essa será uma classe normal que herda de Exception ou de uma de suas filhas. Para que ela seja evitável ( uncheked), vamos herdar de RuntimeException:
package br.com.casadocodigo.livraria.exception;
public class AutorNuloException extends RuntimeException { public autorNuloException(String mensagem) {