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 ?
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"
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:
- wyjątek jest wyrzucany
- wyjątek jest przechwytywany i zwracana wartość jest ustawiona na 5
- na koniec blok zostanie wykonany i zwracana wartość zostanie ustawiona na 10
- funkcja zwraca
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.
- wartość zwracana jest umieszczana na stosie przez kod catch.
- następnie kod finally jest wykonywany i nadpisuje wartość na stosie.
- 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).
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.
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
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.
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.
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