Pegadinha: return dentro de cláusula finally

12 respostas
Luca

Olá

Explique o que imprime o código abaixo:
public class Test {

   public static void main(String[] args) {
      try {
         doSomething();
         System.out.println("Normal");
      } catch (RuntimeException e) {
         System.out.println("RuntimeException");
      }
   }
  
   public static void doSomething() {
      try {
      
         throw new RuntimeException();
      } finally {
         return;
      }
   }
}

[]s
Luca

12 Respostas

thiago.correa

Imprime normal pois o bloco finally sempre é executado, nesse caso temos a cláusula return, o que acaba tendo uma prioridade sobre o throw (Errei muito essa questão no BlackBelt por isso sei :lol: )

LPJava

o metodo finally sempre é executado… mais quando vc poe return dentro de um metodo do tipo void o metodo para de executar…

Luca

Olá

Certo!

A turma está esperta com o funcionamento do finally.

[]s
Luca

arochafademac

Alguem pode me explicar?
Nao entendi nada…rs

Ironlynx

O que vc não entendeu?A explicação do Thiago e do LP já dizem tudo!

furutani

Olá

Ai vai meu chute :smiley: (sem rodar o programa)
Não imprimi nada por que é lançado o RuntimeException, se assim assim nem entra no finally pois é uma RuntimeException.
Acertei?

LPJava

furutani:
Olá

Ai vai meu chute :smiley: (sem rodar o programa)
Não imprimi nada por que é lançado o RuntimeException, se assim assim nem entra no finally pois é uma RuntimeException.
Acertei?

pq ele nao entra no finally? lembre-se ele sempre é executando independente de ocorrer uma exceção ou nao… sempre será executado agora nada é garantido que ele vai ser concluido…
vc pode combinar:

try{}catch{}
try{}finally{}
Sami_Koivu

E esse código: Imprime o que? Por quê?

public class Finally {
	static int value=0;

	public static void main(String[] args) {
		System.out.println(getValue());
		System.out.println(Finally.value);
	}

	public static int getValue() {
		try {
			return Finally.value;
		} finally{
			Finally.value++;
		}
	}
}
LPJava
Sami Koivu:
E esse código: Imprime o que? Por quê?
public class Finally {
	static int value=0;

	public static void main(String[] args) {
		System.out.println(getValue());
		System.out.println(Finally.value);
	}

	public static int getValue() {
		try {
			return Finally.value;
		} finally{
			Finally.value++;
		}
	}
}

imprime 0.
e depois imprime 1.

variavel static, o valor é compartilhado.. finally é executado "sempre"

flw!

furutani

Olá

pq ele nao entra no finally? lembre-se ele sempre é executando independente de ocorrer uma exceção ou nao… sempre será executado agora nada é garantido que ele vai ser concluido…
vc pode combinar:

try{}catch{}
try{}finally{}


Eu me equivoquei em relação ao RuntimeException, esse tipo de exceção não-checada podem ser tratadas tbem. Ou seja confundi com exceções do tipo Error.
Então no codigo passado é impresso Normal.

LPJava

exato… mais Error é uma exceção tb nao-checada ela so nao extends a class RuntimeException.

Sami_Koivu

LPJava:

imprime 0.
e depois imprime 1.

variavel static, o valor é compartilhado… finally é executado “sempre”

flw!

Está certo. A parte interessante que eu quis destacar é que… ele avalia o valor de retorno (ou seja, 0) e depois executa o bloco finally (que seta o valor para 1).

Criado 28 de junho de 2007
Ultima resposta 30 de jun. de 2007
Respostas 12
Participantes 7