2017-06-04 9 views
5

natknąłem to pytanie i nie jestem w stanie zrozumieć przyczynę wyjściem jest dawanie.String powraca w końcu i próbować blokować

Program:

public static String method(){ 

    String s = new String(); 
    try 
    { 
     s = "return value from try block"; 
     return s; 
    } 
    catch (Exception e) 
    { 
     s = s + "return value from catch block"; 
     return s; 
    } 
    finally 
    { 
     s = s + "return value from finally block"; 
    } 

} 

Wyjście jest: wartość

powrót z bloku try

Teraz debugowany go i wartość s w return s oświadczenie, w try blok return value from try block, return value from catch block po niej returned from finally block.

Wciąż wyjście jest:

wartość

powrót z bloku try

Może ktoś proszę wyjaśnić to zachowanie?

+0

Zobacz ten https: // stackoverflow.com/questions/65035/does-finally-always-execute-in-java – mmuzahid

+1

Myślę, że znajdziesz tu więcej wyjaśnień [Try-catch-finally-return clarification - Stack Overflow] (https://stackoverflow.com/questions/15225819/try-catch-finally-return-clarification) –

+0

Odpowiedź będzie pochodzić z dokumentacji oracle: "Blok finally jest zawsze wykonywany po wyjściu bloku try, co zapewnia, że ​​blok finally zostanie wykonany, nawet jeśli wystąpi nieoczekiwany wyjątek. " sprawdź to odwołanie: https://docs.oracle.com/javase/tutorial/essential/exceptions/finally.html – Oghli

Odpowiedz

1

Przede wszystkim pozwala nam zrozumieć, jak Java obsługuje połączenia metod. Istnieje osobna pamięć stosu dla każdego wątku. Gdy wywołujemy dowolną metodę, Java wewnętrznie wstawia rekord na górze stosu. Płyta zawiera pewne szczegóły, takie jak parametry & obiekt itp

Oto jeden interesujący pole jest tam: wartość zwracana. Ilekroć napotkana jest instrukcja return, pole jest aktualizowane. Teraz obserwuj kod.

W bloku try pole wartości zwracanej jest ustawione na wartość zwracaną z bloku try. Teraz, zgodnie z sekwencją wykonania, wykonywany jest blok finally. Teraz blok finally modyfikuje odwołanie do ciągu znaków s. Nie zmodyfikowano pola return value, które zostało wcześniej ustalone przez blok try. Wreszcie wywołanie metody zakończone & Java wewnętrznie pop rekordu & zwrócić pole wartości zwracanej. Zwraca wartość zwracaną z bloku try.

Jeśli blok finally zwróci ciąg po modyfikacji, to pole wartości zwracanej zostanie ponownie zaktualizowane, a zaktualizowany ciąg zostanie zwrócony.

-2

wreszcie

wreszcie jest używany w instrukcji try/catch na wykonanie kodu „zawsze”

lock.lock(); 
try { 
    //do stuff 
} catch (SomeException se) { 
    //handle se 
} finally { 
    lock.unlock(); //always executed, even if Exception or Error or se 
} 

Java 7 ma nowego spróbować z rachunku zasobów, których można użyć, aby automatycznie zamknie zasobów, które wyraźnie lub niejawnie wdrożyć java.io.Closeable lub java.lang.AutoCloseable

Powiązane problemy