Czy możemy użyć instrukcji return w bloku w końcu. Czy to może spowodować jakiś problem?Czy możemy użyć "return" w końcu bloku
Odpowiedz
Wracając od wewnątrz finally
blok spowoduje exceptions
do zgubienia.
Instrukcja return wewnątrz bloku finally spowoduje, że każdy wyjątek, który może zostać odrzucony w bloku try lub catch, zostanie odrzucony.
Według Java Language Specification:
Jeżeli wykonanie bloku try kończy się nagle z jakiegokolwiek innego powodu R, wtedy wreszcie blok jest wykonywany, a następnie istnieje możliwość wyboru:
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 - instrukcja return zawsze kończy się nagle.
Cytat JLS nie obsługuje twojego oświadczenia o oświadczeniu return wewnątrz bloku finally? – linski
Te linie z JLS są wyjątkami, ale są one również prawdziwe w przypadku instrukcji return. –
Nadal nie widzę relacji między cytatem a twoim stwierdzeniem - napisałem [fragment kodu] (http://ideone.com/1GaeBo), który pokazuje, że kiedy blok finally zawiera instrukcję return, to wyjątki są zgłaszane z bloku catch dostać zjedzony, ale te wyrzucone z bloku try zostać złapany. Proszę zweryfikuj. – linski
Tak, można napisać instrukcję return w bloku finally, i zastąpi ona drugą wartość zwracaną.
Edycja:
na przykład w kodzie poniżej
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ście jest zawsze 2, tak jak 2 wraca z ostatecznie zablokować. Pamiętaj, że w końcu zawsze wykonuje, czy istnieje wyjątek, czy nie. Tak więc, gdy uruchomiony zostanie blok finally, będzie on zastępował wartość zwracaną przez inne. Zapisywanie instrukcji return w bloku finally nie jest wymagane, w rzeczywistości nie powinieneś go pisać.
czy możesz wyjaśnić? –
try {wyrzuca nowy wyjątek(); } catch {wyrzuca nowy wyjątek();} wreszcie {return 5; } Co się dzieje? –
Zobacz edycje – Krushna
return
można napisać oświadczenie w finally
bloku lecz wartość zwracana z try
blok będzie aktualizowana na stosie, a nie wartości zwracanej finally
bloku.
Powiedzmy 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 dzwonisz to od sposobu głównej
public static void main(String[] args){
System.out.println(getNumber());
}
Drukuje
7
5
Tak, możesz, ale nie powinieneś 1, ponieważ the finally block jest przeznaczony do specjalnego celu.
wreszcie jest przydatna nie tylko obsługi wyjątków - pozwala programiście, aby uniknąć konieczności kodu oczyszczania przypadkowo zablokowanych przez powrót, kontynuować lub złamać. Umieszczenie kodu porządkowego w bloku finally jest zawsze dobrą praktyką, nawet jeśli nie przewiduje się wyjątków.
Nie zaleca się pisania wewnątrz logiki.
To nie wyjaśnia zbyt wiele. Odpowiedź TJ Crowdera jest o wiele lepsza - https://stackoverflow.com/questions/15225819/try-catch-finally-return-clarification –
@BoratSagdiyev Jeśli jest zbyt szczegółowy ... przeczytaj i przeczytaj o tym. Dzięki –
- 1. Czy możemy dodać do {% bloku%} zamiast nadpisywać?
- 2. Czy można w końcu użyć funkcji catch catch inside?
- 3. Czy możemy użyć $ sce.trustAsHtml (string) z "filtru"?
- 4. Czy w końcu całkowicie wykonać, jeśli wyjątek jest wrzucony w końcu bloku
- 5. W końcu bloku, mogę stwierdzić, czy wyjątek został rzucony
- 6. Czy możemy użyć pom.xml do ANT
- 7. Czy możemy użyć znacznika wideo w znaczniku rysunku w HTML5
- 8. Czy możemy użyć liczby jako węzła tekstowego w pliku XML?
- 9. Czy możemy użyć modelu żądania/odpowiedzi w wiadomościach publikowania/subskrybowania?
- 10. Czy możemy użyć wyrażenia regularnego w kontroli dostępu symfony2?
- 11. Co możemy użyć zamiast nstimer?
- 12. Zachowanie instrukcji return w haku, a na końcu
- 13. Jak mogę wielokrotnie użyć bloku?
- 14. Czy możemy użyć zmiennej Pythona do przechowywania całego pliku?
- 15. Czy ThreadAbortException może w końcu przejść?
- 16. Co lepiej użyć, __try/__ oprócz bloku lub bloku try/catch?
- 17. Jak uruchomić kod po wywołaniu Sytem.exit (0) w końcu bloku
- 18. Czy możemy użyć funkcji aktualizacji Firebase do aktualizacji priorytetu również
- 19. Czy możemy użyć Microsoft.AspNet.WebApi.Client z aplikacji ASP.NET Core?
- 20. Czy możemy użyć wątku wewnątrz głównego menu [STAThread]?
- 21. Czy możemy użyć wyrażenia regularnego ze wspólnym zapytaniem o jquery?
- 22. Czy możemy użyć QT z C# do stworzenia GUI?
- 23. Czy możemy użyć Rubiego na szynach do opracowania aplikacji mobilnej?
- 24. Czy możemy użyć <body> zamiast #container div?
- 25. Czy możemy użyć AtomicInteger jako zmiennej lokalnej w metodzie i osiągnąć bezpieczeństwo wątku?
- 26. Czy możemy użyć czystego Bootstrapa z plikiem React.js?
- 27. Czy możemy użyć aplikacji Github mac z GitLab?
- 28. Czy możemy użyć sprzężenia dla dwóch różnych tabel bazy danych?
- 29. Czy `finally` blokuje się w przypadku, gdy` return` znajduje się w bloku `try` lub` catch`?
- 30. W Pythonie, czy powinienem użyć else po powrocie w bloku if?
Możesz również przejść przez [** ten wpis **] (http://stackoverflow.com/q/18131447/1679863) –