Мне было интересно, почему следующий код будет принят компилятором Java:
public class Main {
public static void main(String ... args){
System.out.println("a() = " + a());
}
public static String a (){
try {
return "a";
}catch(Throwable t){
}finally{
return "b";
}
}
}
Это может и не должно работать. Спецификация java заявляет, что блок finally
будет выполняться всегда, но в то же время возвращаемое значение уже указано. Поэтому либо вы не можете выполнить оператор return "b"
, потому что вы вышли в return "a"
, что было бы неверно.
Однако другой вариант заключается в том, что вы выполняете оператор return "b"
и тем самым полностью игнорируете инструкцию return "a"
...
Я бы сказал, что оба ошибаются, и я бы ожидал, что это не скомпилируется. Однако он компилируется и работает нормально. Я оставлю ответ в виде приятного упражнения для читателя;).
В основном, мой вопрос: помимо плохой практики, будет ли это считаться ошибкой Java, или это имеет другие прекрасные применения, кроме обфускации?
Изменить:
Вопрос не столько в том, что это ошибка, но и в том, что у него есть хорошие варианты использования?