Exceptions

o seguinte código:

class Emu{
static String s="-";
public static void main (String[] args){

try{
throw new Exception();
}
catch(Exception e){

try{
try{
throw new Exception();
}
catch(Exception ex){ s+= "ic ";}
throw new Exception();
}
catch(Exception x){ s+= "mc "; }
finally {s+= "mf "; }
}
finally{ s+= "of "; }
System.out.println(s);
}
}

tem como resultado : “-ic mc mf of”.
no entanto, no primeiro bloco try eu tenho throw new Exception();… eu não preciso declarar esta exception para poder utiliza-la ?

Não.

Com esta linha de código, a Exception que for criada com o new será jogada assim que terminar de executar o construtor.

Não entendi direito sua pergunta. Abaixo segue o seu código identado e onde cada exceção lançada é capturada, para ajudar:

class Emu{
    static String s="-";
    public static void main (String[] args){

        try{
            throw new Exception();  // Exceção 1 é lançada
        }
        catch(Exception e){  // Exceção 1 é capturada

            try{
                try{
                    throw new Exception(); // Exceção 2 é lançada
                }
                catch(Exception ex){ s+= "ic ";} // Exceção 2 é capturada
                throw new Exception(); // Exceção 3 é lançada
            }
            catch(Exception x){ s+= "mc "; } // Exceção 3 é capturada
            finally {s+= "mf "; }
        }
        finally{ s+= "of "; }
        System.out.println(s);
    }
}

Pode explicar melhor sua dúvida?

cara, a minha duvida é que no livro da kathy diz que pra disparar uma exceção tipo “throw algumacoisa” tu tens que declarar na assinatura do metodo tipo " public void met1() throws algumacoisa{}"…mas no meu metodo main eu não declaro nada…no entanto eu disparo, no primeiro bloco try, uma instancia de Exception…
como pode isso ?!?!?

Ah, tá.

Você só precisa incluir na assinatura de seu método que uma exceção será lançada se essa exceção for lançada “para fora” do método, ou seja, o tratamento dela será no método que chama o seu método. No caso do código que você postou, todas as exceções lançadas estão sendo tratadas dentro do método, então elas não são lançadas “para fora” do método, então não precisam (e não podem) ser especificadas na assinatura.

Certo? :wink:

Em resumo, se vc não tratar as exceptions tirando os try e catch ai você é obrigado a utilizar o throws na assinatura do método, obrigando a quem estiver chamando este método a tratar as exceptions que não são tratadas no método (pois está jogando as exceptions para cima sem tratar - sem try e catch)