Exceptions? Não entendo sua utilidade

[quote=ECO2004][quote]
Você está levantando a exceção ArithmeticException para a mesma ser tratado no catch Exception.
Porém, dentro do catch Exception você está levantando a mesma novamente. Logo, quem irá trata-la ???
[/quote]

Eu não entendi direito.
ArithmeticException será tratado no catch (ArithmaticException) e no catch (Exception) ?
Isso foi o que entendi da sua explicação. [/quote]

Oi,

Você está lançando novamente a exceção ArithmaticException dentro do catch (ArithmeticException ex).

A partir do momento que você faz throw ex, esta indicando que um outro catch deverá trata-la.

Tchauzin!

Bem estou acompanahndo e achei interessante, permitam-me interferir.

Então se entendi bem, no primeiro caso, esta lançando uma exceção ‘ArithmeticException’ é porque eu sei o tipo de exceção que o código do try pode gerar e trato ele no catch com ArithmeticException. É isso?

No seguno caso lanço uma exceção qualquer porque, supondo que eu não sei qual tipo de exceção o código pode gerar, ms sei que ele é ‘perigoso’. E consulto sobre isso olhando na API.

Então eu poderia trocar no segundo exemplo:

catch(ArithmeticException ex) { System.out.println(" 5 "); throw ex; }

por:

catch(Exception ex) { System.out.println(" 5 "); throw ex; }
Que lança a exceção normal, ou tem alguma diferença nisso?

Outra pergunta, se estou executando a minha função no main, eu tenho que lançar uma exceção no metodo main?

[quote=Soleo]Bem estou acompanahndo e achei interessante, permitam-me interferir.

Então se entendi bem, no primeiro caso, esta lançando uma exceção ‘ArithmeticException’ é porque eu sei o tipo de exceção que o código do try pode gerar e trato ele no catch com ArithmeticException. É isso?

No seguno caso lanço uma exceção qualquer porque, supondo que eu não sei qual tipo de exceção o código pode gerar, ms sei que ele é ‘perigoso’. E consulto sobre isso olhando na API.

Então eu poderia trocar no segundo exemplo:

catch(ArithmeticException ex) { System.out.println(" 5 "); throw ex; }

por:

catch(Exception ex) { System.out.println(" 5 "); throw ex; }
Que lança a exceção normal, ou tem alguma diferença nisso?

Outra pergunta, se estou executando a minha função no main, eu tenho que lançar uma exceção no metodo main?

[/quote]

Sim, você poderia trocar.
Eu fiz uma diferenciação porque eu desejo tratar cada uma de uma maneira. Mas se quiser tratar todas as possíveis em uma Exception, pode.

[quote=lina][quote=ECO2004][quote]
Você está levantando a exceção ArithmeticException para a mesma ser tratado no catch Exception.
Porém, dentro do catch Exception você está levantando a mesma novamente. Logo, quem irá trata-la ???
[/quote]

Eu não entendi direito.
ArithmeticException será tratado no catch (ArithmaticException) e no catch (Exception) ?
Isso foi o que entendi da sua explicação. [/quote]

Oi,

Você está lançando novamente a exceção ArithmaticException dentro do catch (ArithmeticException ex).

A partir do momento que você faz throw ex, esta indicando que um outro catch deverá trata-la.

Tchauzin![/quote]

Obrigado pela ajuda!

[/b]

O meu maior problema está com o Exception…

Na main, eu tenho, p. ex:

Funcao(10, 0);

Na implementação de Funcao, eu implemento um throws ArithmeticException e trato essa mesma excessão no catch.
Se eu coloco Exception apenas, no lugar de ArithmeticException e mudo no catch de ArithmeticException para Exception, diz na main que não tratei a excessão.

Antes:

public static Funcao f(int x, int y) throws ArithmeticException 
	{
		 try 
		 {
			 System.out.println(" 1 ");
			 return x/y;
		 }
		 
		 catch(ArithmeticException ex) 
		 {
			 System.out.println(" 2 ");
			 throw ex;
		 }
		 
		 finally 
		 {
			 System.out.println(" 3 ");
		 }
	}

Depois:


public static int f(int x, int y) throws Exception 
	{
		 try 
		 {
			 System.out.println(" 1 ");
			 return x/y;
		 }
		 
		 catch(Exception ex) 
		 {
			 System.out.println(" 2 ");
			 throw ex;
		 }
		 
		 finally 
		 {
			 System.out.println(" 3 ");
		 }
	}

Por que com excessões em particular (Arithmetic, InputMismatch, IndexOutOfBounds…) funciona e com Exceptiom, que é generalizado, não funciona ?

[quote]
lina:

Podemos definir ‘throws’ como lançar/atirar/jogar.

No caso acima, você irá lançar uma Exception. Ou seja, poderá ser lançada qualquer exceção e não uma em especifico!

No exemplo abaixo, você lança o ArithmeticException, que por sua vez já esta sendo tratado no código. Logo o compilador identifica isso.[/quote]

Mas quando você coloca “throws” no método:

public Integer dividir (int num1, int num2) throws ArithmeticException  {
int res;
try {
   res=num1/num2;
} catch (ArithmeticException ex) {
   System.out.println(ex); 
}
return res;
}

E depois chama este método (em outro método) você tem que colocar o “throws” de novo, sendo que este segundo não gera exceção:

public void resultado() throws ArithmeticException {
   int n1=5;
   int n2=0;
   dividir(n1, n2);
}

Então eu pergunto é necessário dizer para os métodos (dividir e resultado) que poderá ser lançada uma exeção :?:
Apenas o “try catch” do método dividir seria necessário, não é :?:

[quote=InicianteJavaHenrique][quote]
lina:

Podemos definir ‘throws’ como lançar/atirar/jogar.

No caso acima, você irá lançar uma Exception. Ou seja, poderá ser lançada qualquer exceção e não uma em especifico!

No exemplo abaixo, você lança o ArithmeticException, que por sua vez já esta sendo tratado no código. Logo o compilador identifica isso.[/quote]

Mas quando você coloca “throws” no método:

public Integer dividir (int num1, int num2) throws ArithmeticException  {
int res;
try {
   res=num1/num2;
} catch (ArithmeticException ex) {
   System.out.println(ex); 
}
return res;
}

E depois chama este método (em outro método) você tem que colocar o “throws” de novo, sendo que este segundo não gera exceção:

public void resultado() throws ArithmeticException {
   int n1=5;
   int n2=0;
   dividir(n1, n2);
}

Então eu pergunto é necessário dizer para os métodos (dividir e resultado) que poderá ser lançada uma exeção :?:
Apenas o “try catch” do método dividir seria necessário, não é :?: [/quote]

No seu método resultado não precisa do throws, pois a exceção já foi tratada no seu método dividir.
Na segunda pergunta: sim, apenas o try e catch são suficientes.

Pelo que andei vendo, e muito, o throws é um indicador que poderão ser lançados as exceções que você colocar.
O único problema é que não pode colocar throws Exception no módulo em que está tratando a exceção. Se a chamada da função estiver em um try, catch, aí você poderá colocar quantos catches quiser. Até mesmo um Exception. Na implementação de seu módulo, aí sim é permitido fazer um throws Exception, junto com outros, caso queria.

Espero que alguém saiba explicar o porquê de não poder colocar um throws Exception no módulo em que está sendo tratado as exceções - Em “não compila, abaixo”

Abaixo um exemplo:

Pode:

public static void main(String[] args)
{
       g(10,0);
}

public static int g(int x, int y)
{		
       try 
      {
           System.out.println(" 4 ");
           return x/y;
      }
	 
      catch(ArithmeticException ex)
      {
            System.out.println(" 5 ");
            throw ex;
      }
		
      catch(Exception e)
     {
           System.out.println("Erro inexplicado!");
           return -1;			
      }
}

Não compila:

[code]public static int g(int x, int y) throws Exception
{
try
{
System.out.println(" 4 ");
return x/y;
}

  catch(ArithmeticException ex)
  {
        System.out.println(" 5 ");
        throw ex;
  }
	
  catch(Exception e)
 {
       System.out.println("Erro inexplicado!");
       return -1;			
  }

}[/code]

Também não compila:

[code]public static int g(int x, int y) throws ArithmeticException, Exception
{
try
{
System.out.println(" 4 ");
return x/y;
}

  catch(ArithmeticException ex)
  {
        System.out.println(" 5 ");
        throw ex;
  }

 catch(Exception e)
 {
       System.out.println("Erro inexplicado!");
       return -1;			
  }

}[/code]

Só uma observação que gostaria de colocar. [além de ajuda tb quero ajudar]

Os dois tipos de exceções são verificadas e não-verificadas. Um exemplo da primeira é um IOException. Esse tipo de exceção - verificado - impõe o requisito catch or declare, que nada mais é que é obrigatório ter nessas nos código que possam gerar essas exceções ou um throws ou um try e catch. Sem um dos dois, o compilador gera errro. Tente, por ex., criar um objeto Writer sem um dos dois e verá.
A segunda classe de exceções - não verificadas - não impõe nem try/catch nem throws.

[quote=gomesrod]

[quote=Anime]Oi,

Não precisa dar bronca é só explicar… :? [/quote]
Não se preocupe, foi com jeitinho :smiley:
Para o bem dele…[/quote]

Que bom… :stuck_out_tongue:

Pior que fiquei preocupada mesmo rs…

Sim eu entendir isto, pela lógica a exceção já foi tratada.

Sim eu também entendir isto :slight_smile: , mas o caso é que se você pensar: "…vou colocar os dois (try/catch e throws) porque o Netbeans sugere: “…circundar com throws”, na primeira opção e/ou “…circundar com try/catch”, na segunda opção. Aqui que acontece o problema, você coloca os dois, mesmo [quote]apenas o try e catch são suficientes.[/quote], ai cada método que você chamar (incluse no construtor) o Netbeans pede para “…circundar com throws”, cada método.

Enfim, isto não é uma dúvida, é uma afirmação, que pode confundir :? um pouco no começo.