Czy możemy użyć "return" w końcu bloku [duplikat]

To pytanie ma już odpowiedź tutaj:

Czy możemy użyć instrukcji return w wreszcie bloku. Czy to może powodować jakiś problem?

Author: Shakeeb Ayaz, 2013-08-13

4 answers

Powrót z bloku finally spowoduje utratę exceptions.

Instrukcja return wewnątrz bloku finally spowoduje, że każdy wyjątek, który może zostać wyrzucony w bloku try lub catch, zostanie odrzucony.

Zgodnie z specyfikacja języka Java:

Jeśli wykonanie bloku try zakończy się nagle z jakiegokolwiek innego powodu R, wtedy blok finalny jest wykonywany, a następnie jest wybór:

   If the finally block completes normally, then the try statement
   completes  abruptly for reason R.

   If the finally block completes abruptly for reason S, then the try
   statement  completes abruptly for reason S (and reason R is
   discarded).

Uwaga: zgodnie z JLS 14.17 - polecenie return zawsze kończy się nagle.

 30
Author: Ankur Lathi,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-04-19 15:10:02

Tak możesz napisać instrukcję return w bloku finally I nadpisze ona drugą zwracaną wartość.

EDIT:
Na przykład w poniższym kodzie

public class Test {

    public static int test(int i) {
        try {
            if (i == 0)
                throw new Exception();
            return 0;
        } catch (Exception e) {
            return 1;
        } finally {
            return 2;
        }
    }

    public static void main(String[] args) {
        System.out.println(test(0));
        System.out.println(test(1));
    }
}

Wyjściem jest zawsze 2, ponieważ zwracamy 2 z bloku finally. Pamiętaj, że finally zawsze wykonuje, czy istnieje wyjątek, czy nie. Tak więc, gdy ostatni blok zostanie uruchomiony, nadpisze wartość zwracaną innych. Zapisywanie poleceń return w bloku finally nie jest wymagane, w rzeczywistości nie powinno się go zapisywać.

 18
Author: Krushna,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-12-15 07:10:03

Tak, możesz, ale nie powinieneś 1, Ponieważ ostatni blok jest przeznaczony do specjalnego przeznaczenia.

Wreszcie jest przydatny nie tylko do obsługi wyjątków - pozwala programiście uniknąć przypadkowego ominięcia kodu czyszczenia przez zwrot, kontynuację lub przerwę. Umieszczanie kodu oczyszczającego w bloku finally jest zawsze dobrą praktyką, nawet jeśli nie przewiduje się żadnych WYJĄTKÓW.

Pisanie logiki w nim nie jest zalecane.

 2
Author: ꜱᴜʀᴇꜱʜ ᴀᴛᴛᴀ,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2013-08-13 09:40:18

Można zapisać polecenie return w bloku finally, ale wartość zwracana z bloku try zostanie zaktualizowana na stosie, a nie wartość zwracana bloku finally.

Powiedzmy, że masz tę funkcję

private Integer getnumber(){
Integer i = null;
try{
   i = new Integer(5);
   return i;
}catch(Exception e){return 0;}
finally{
  i = new Integer(7);
  System.out.println(i);
}
}

I wywołujesz to z głównej metody

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

To drukuje

7
5
 0
Author: Prasad Kharkar,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2013-08-13 09:41:58