Exceções (Exception) [RESOLVIDO]

[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]

Bem… primeiro, cuidado com o “quote”…

Seu erro está em "4 - Exception é tratada no próprio método. Há um catch(Exception ex). ". O catch trata SOMENTE o que está DENTRO do Try. O que está no catch, tem de ser feito separado. Como você “arremessa” um exception, alguém tem de tratar…

Por exemplo, execute esse main e veja o output…

public static void main(String[] args) { try { try { int i = 1/0; System.out.println("Infinito = " + i); } catch (ArithmeticException ae) { throw new Exception("Mas como 1 não divide por 0?", ae); } } catch (Exception e) { e.printStackTrace(); } }

[quote]java.lang.Exception: Mas como 1 não divide por 0?
at Mochila.main(Mochila.java:16)
Caused by: java.lang.ArithmeticException: / by zero
at Mochila.main(Mochila.java:13)[/quote]

[quote=leo.andven]Bem… primeiro, cuidado com o “quote”…

Seu erro está em "4 - Exception é tratada no próprio método. Há um catch(Exception ex). ". O catch trata SOMENTE o que está DENTRO do Try. O que está no catch, tem de ser feito separado. Como você “arremessa” um exception, alguém tem de tratar…

Por exemplo, execute esse main e veja o output…

public static void main(String[] args) { try { try { int i = 1/0; System.out.println("Infinito = " + i); } catch (ArithmeticException ae) { throw new Exception("Mas como 1 não divide por 0?", ae); } } catch (Exception e) { e.printStackTrace(); } }

[quote]java.lang.Exception: Mas como 1 não divide por 0?
at Mochila.main(Mochila.java:16)
Caused by: java.lang.ArithmeticException: / by zero
at Mochila.main(Mochila.java:13)[/quote]

[/quote]

O que escrevi em 4 está certo. Só houve um desentendimento. É claro que o catch trata somente o que ocorre dentro do try (isso se o que aconteceu no try está implementado em algum catch).

Pela divisão de 1/0, gera uma exceção. O método avisou que poderia acorrer, através do throws Exception. Essa exceção ocorre no bloco try. Abaixo, tem o bloco catch(Exception), que, pelo menos, deveria capturar a exceção. Infelizmente, aparece o erro de que não tratei a exceção.

Com relação ao quotes, tou usando certo a ferramenta. Na página que está aparecendo apenas o primeiro.

Continuando… :slight_smile:

O escopo das coisas está complicado. Quando você declara que um método solta uma exceção, você está dizendo: alguma coisa dentro de mim (:oops: ) pode soltar uma exceção e eu não estou tratando ela; favor tratar. O método não está declarando que pode acontecer e ser tratado dentro dele. Ele nem deve expor isso se é algo interno (pelos conceitos de encapsulamento et al)

Por que isso está acontecendo no seu código: o “throws ex” dentro do catch está soltando a exception NOVAMENTE. Como não tem nenhum “try” “em cima”/contendo ela, o método tem de declarar isso (porque o catch é feito por Exception, não por Ar.Ex.)

Clareou?

Oi,

Jesus amado. Passei ontem a tarde inteira explicando isso e tem outro tópico tratando o mesmo assunto?!

http://www.guj.com.br/java/52909-exceptions-nao-entendo-sua-utilidade/2#1250392

É por isso que as vezes fico chateada com o fórum =/

Tchauzin!

:shock:

Tranca esse, moderadora! Ou o outro!

[quote=leo.andven] :shock:

Tranca esse, moderadora! Ou o outro![/quote]

Oi,

Agora não sei mais o que fazer! :shock:

Esse ou o outro? rsrs

Qual esta mais perto da solução?

Tchauzin!

Pergunta pro OP… eu acho que nenhum dos dois :roll:

tranca o outro, ja que o autor é o mesmo… e aqui tiveram umas explicações muito claras sobre o porque o eclipse não indica erro quando não trata uma exceção que se extende a RuntimeException (eu particularmente não sabiaa hehe)

acho que se alguém tiver alguma dúvida quanto a isso ela será sanada olhando esse tópico aqui…

abraço

Oi,

It’s done.

Obrigada!

Tchauzin!

[quote=leo.andven]Continuando… :slight_smile:

O escopo das coisas está complicado. Quando você declara que um método solta uma exceção, você está dizendo: alguma coisa dentro de mim (:oops: ) pode soltar uma exceção e eu não estou tratando ela; favor tratar. O método não está declarando que pode acontecer e ser tratado dentro dele. Ele nem deve expor isso se é algo interno (pelos conceitos de encapsulamento et al)

Por que isso está acontecendo no seu código: o “throws ex” dentro do catch está soltando a exception NOVAMENTE. Como não tem nenhum “try” “em cima”/contendo ela, o método tem de declarar isso (porque o catch é feito por Exception, não por Ar.Ex.)

Clareou?[/quote]

Ok…entendi…

Grato!

só faz aquele esquema de editar o seu primeiro post do tópico escrevendo [RESOLVIDO] junto ao assunto pra agradar os moderadores aí hehe

Oi,

A questão não é agradar. A pessoa que geralmente tem a mesma dúvida, saberá que existe em algum post dessa thread a solução! :smiley:

Tchauzin!

:thumbup:

O mundo seria melhor sem Exceptions! E, como diria Yoda