[quote=leo.andven]Respondendo à pergunta original…
O compilador requer que você coloque o “throws” no main porque na definição do método você declarou “throws Exception”. Isso indica que aquele método pode arremessar uma exception do tipo Exception. Algumas exceções podem ser arremessadas sem ninguém tratar (todas as derivadas do RuntimeException). A ArithmeticException é uma delas. A Exception não.
Com a linha do “g”, o compilador vê: alguém arremessa uma exceção que deve ser tratada e não é por ninguém. Por isso, ele chia. Com o “f”, ele vê "ah, é uma RuntimeException, ninguém precisa tratar (mas pode tratar se quiser).
Com o “throws” no main, você delega o tratamento para quem chama ela.[/quote=leo.andven]
Ficou claro?!
Primeiramente, obrigado pela explicação…
public static int g(int x, int y) throws Exception
{
try
{
System.out.println(" 4 ");
return x/y;
}
catch(Exception ex)
{
System.out.println(" 5 ");
throw ex;
}
finally
{
System.out.println(" 6 ");
}
}
public static void main(String[] args)
{
g(10, 0);
}
1 - A main chama o método “g”.
2 - O método “g” pode lançar uma exceção do tipo Exception.
3 - Exception é uma exceção verificada. Precisa ser tratada.
4 - Exception é tratada no próprio método. Há um catch(Exception ex).
5 - Mesmo assim, há erro dizendo que não tratei a exceção.
O pessoal tá bravo porque estou insistindo no assunto. Parece que não entendo. Mas não entendo porque o pessoal tá falando que throws é usado quando não é responsabilidade do método implementar a captura da exeção. É boa prática de programação, não regra.
1 - Se tem throws, ela joga a responsabilidade para quem chamou o método.
2 - Caso contrário, trate com try/catch - se quiser, pois depende se é obrigatório ou não.
Bem, eu sei fazer o programa funcionar.
1 - Retire o throws Exception
ou
2 - try/catch na chamada do método.
Não é o que quero.
Se eu faço:
public static int g(int x, int y) throws ArithmeticException
{
try
{
System.out.println(" 4 ");
return x/y;
}
catch(ArithmeticException ex)
{
System.out.println(" 5 ");
throw ex;
}
finally
{
System.out.println(" 6 ");
}
}
Tudo Ok.
Seu eu faço:
public static int g(int x, int y) throws Exception
{
try
{
System.out.println(" 4 ");
return x/y;
}
catch(Exception ex)
{
System.out.println(" 5 ");
throw ex;
}
finally
{
System.out.println(" 6 ");
}
}
…não funciona (pia, como o amigo disse acima). Isso é independente de qual exceção esteja sendo tratada no catch. O problema está no thows Exception.
Na chamada do método “g(10, 0)”, certamente gerará uma ArithmeticException. Porém, ArithmeticException é filha de Exception. Quando o JVM vir a minha função, ele verá que o método pode gerar uma exceção e pedirá para que seja tratado. E é isso que faço quando coloco catch(Exception) em “g”.
Com outras exceções não preciso fazer isso…
public static int g(int x, int y) throws ArithmeticException
{
try
{
System.out.println(" 4 ");
return x/y;
}
catch(ArithmeticException ex)
{
System.out.println(" 5 ");
throw ex;
}
finally
{
System.out.println(" 6 ");
}
}
public static void main(String[] args)
{
g(10, 0);
}
…acima, não preciso.
Se falarem NÃO PODE USAR THROWS EXCEPTION NO MÉTODO EM QUE ESTÁ SENDO IMPLEMENTADO COM TRY/CATCH PORQUE NÃO PODE, eu paro com insistir.
[/quote]