Bom o throw é quando você quer avisar ao contexto anterior da sua pilha de execução que algo saiu errado.
Por exemplo.
(...)
// O throws aqui dfiz que esse método pode disparar essa excessão!
public void sacar(Double quantidade) throws SaqueNegativoException{
if(quantidade < 0){
// Disparando a excessão daqui.
throw new SaqueNegativoException();
}
(...)
}
Nesse caso o seu método sacar sabe que alguma coisa deu errado, mas quem vai ter que tratar isso é quem chamou esse método.
Estamos no modelo e essa classe não sabe para que ‘página’ redirecionar, como avisar isso pro usuário ( em que idioma?), nem mesmo se estamos numa aplicação Web ou Desktop, tudo que sabemos é que algo deu errado e que alguém tem que resolver.
E quem for chamar o método sacar Precisa saber tratar isso, ela tem que decidir o que fazer.
(...)
try{
conta.sacar(valor)
}catch(SaqueNegativoException e){
// A linguagem Java obriga você, quando chama o método sacar a tratar a exceção.
redirecionarPaginaDeErro();
}
Se a classe que usa o método ‘‘sacar’’ ela pode simnplesmente ‘passar pra frente’ novamente:
try{
conta.sacar(valor)
}catch(SaqueNegativoException e){
rollback(); // Desfazendo alterações não finalizadas
// Começando tudo denovo 'subindo' a excessão, não sabemos mais o que fazer aqui, passamos a bola pra quem talvez saiba.
throw e;
}
Espero ter ajudado, se não fui claro pergutae!
Abraço.