Zachowanie deklaracji powrotu w połowach i wreszcie

Proszę zapoznać się z poniższym kodem i wyjaśnić zachowanie wyjścia.

public class MyFinalTest {

    public int doMethod(){
        try{
            throw new Exception();
        }
        catch(Exception ex){
            return 5;
        }
        finally{
            return 10;
        }
    }

    public static void main(String[] args) {

        MyFinalTest testEx = new MyFinalTest();
        int rVal = testEx.doMethod();
        System.out.println("The return Val : "+rVal);
    }

}

Wynikiem jest return Val : 10.

Eclipse wyświetla ostrzeżenie: finally block does not complete normally.

Co się dzieje z instrukcją return w bloku catch ?

Author: ROMANIA_engineer, 2011-04-18

6 answers

Jest nadpisywana przez finally, ponieważ {[0] } jest wykonywana po wszystkim innym.

Dlatego, zasada kciuka - nigdy nie wracaj z finally. Eclipse, na przykład, wyświetla ostrzeżenie dla tego fragmentu: "finally block does not complete normally"

 70
Author: Bozho,
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
2011-04-18 10:52:10

finally jest zawsze wykonywane(jedynym wyjątkiem jest System.exit()). Możesz myśleć o tym zachowaniu w ten sposób:

  1. wyjątek jest wyrzucany
  2. wyjątek jest przechwytywany i zwracana wartość jest ustawiona na 5
  3. na koniec blok zostanie wykonany i zwracana wartość zostanie ustawiona na 10
  4. funkcja zwraca
 49
Author: Vladimir Ivanov,
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
2012-08-07 21:53:51

Jest to łatwe pytanie, jeśli pamiętasz układ niskiego poziomu maszyny wirtualnej.

  1. wartość zwracana jest umieszczana na stosie przez kod catch.
  2. następnie kod finally jest wykonywany i nadpisuje wartość na stosie.
  3. Następnie metoda zwraca z najbardziej aktualną wartością (10)do użycia przez wywołujący.

Jeśli nie jesteś pewien takich rzeczy, wróć do swojego zrozumienia podstawowego systemu (ostatecznie przechodząc do assemblera poziom).

(funny sidenote )

 17
Author: mafu,
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
2011-04-18 11:10:11

Blok finally jest zawsze wykonywany (jeśli została wykonana próba dopasowania), więc zanim metoda zwróci 5 jak w bloku catch, wykonuje Blok finally i zwraca 10.

 3
Author: MByD,
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
2011-04-18 10:53:29

Tutaj wpisz opis obrazka

Wreszcie Blok zawsze jest wykonywany unless I until System.Instrukcja exit () jest pierwsza w finally block.

więc tutaj w powyższym przykładzie Exection jest wyrzucane przez polecenie try i dostaje catch w bloku catch. Istnieje instrukcja return z wartością 5 więc w wartości wywołania stosu5 zostanie dodany później w końcu blok wykonany, a ostatnia wartość zwracana zostanie dodana na szczycie stosu podczas zwracania wartości, stos zwraca najnowszą wartość zgodnie z zachowaniem stosu "LAST in FIRST OUT" zwróci więc wartość 10.

 3
Author: Avinash Pande,
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-05-20 12:36:21

The finally section will execute always execute. np. jeśli masz coś do wydania lub wylogowania, jeśli wystąpi błąd, przejdź do sekcji catch, w przeciwnym razie w końcu wykonasz.

Session session //  opened some session 
try 
{
 // some error 
}
catch { log.error }
finally 
{ session.logout();}

Nie powinno być używane do zwracania czegokolwiek. możesz użyć na zewnątrz.

 0
Author: Vikaaa..,
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
2014-01-15 08:02:57