2013-08-13 13 views

Odpowiedz

25

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.

+0

Cytat JLS nie obsługuje twojego oświadczenia o oświadczeniu return wewnątrz bloku finally? – linski

+0

Te linie z JLS są wyjątkami, ale są one również prawdziwe w przypadku instrukcji return. –

+0

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

10

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ć.

+0

czy możesz wyjaśnić? –

+0

try {wyrzuca nowy wyjątek(); } catch {wyrzuca nowy wyjątek();} wreszcie {return 5; } Co się dzieje? –

+0

Zobacz edycje – Krushna

1

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 
2

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.

+0

To nie wyjaśnia zbyt wiele. Odpowiedź TJ Crowdera jest o wiele lepsza - https://stackoverflow.com/questions/15225819/try-catch-finally-return-clarification –

+0

@BoratSagdiyev Jeśli jest zbyt szczegółowy ... przeczytaj i przeczytaj o tym. Dzięki –

Powiązane problemy