Pegadinha: return dentro de cláusula finally

Olá

Explique o que imprime o código abaixo:

[code]
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;
  }

}
}[/code]

[]s
Luca

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: )

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

Olá

Certo!

A turma está esperta com o funcionamento do finally.

[]s
Luca

Alguem pode me explicar?
Nao entendi nada…rs

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

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?

[quote=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?[/quote]

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{}

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++;
		}
	}
}

[quote=Sami Koivu]E esse código: Imprime o que? Por quê?

[code]
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++;
	}
}

}
[/code][/quote]

imprime 0.
e depois imprime 1.

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

flw!

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{}

[/quote]
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.

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

[quote=LPJava]
imprime 0.
e depois imprime 1.

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

flw![/quote]

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).