Wyjaśnienie „spróbuj złapać wreszcie” [duplikat]
To pytanie ma już odpowiedź tutaj:
Wiele zwrotów: Który ustawia ostateczną wartość zwrotu? 7 odpowiedzi Czytając wszystkie pytania zadane na tym forum dotyczące powyższego tematu (patrz tytuł), doskonale rozumiem, żefinally
jest zawsze wywoływany. (Z wyjątkiemSystem.exit
i nieskończone pętle). Chciałbym jednak wiedzieć, czyreturn
jest wywoływane w bloku catch, a następnie kolejnereturn
jest wywoływane z ostatniego bloku.
Na przykład
public static void main(String[]args) {
int a = new TestClass().absorbeTheValue();
}
int absorbeTheValue() {
try {
int a = 10/0;
if (a > 0) return 4;
} catch(Exception e) {
return 45;
} finally {
return 34;
}
}
Więc tutaj wyjście (gdy wywoływana jest metoda) będzie w każdym razie 34. Oznacza to, że w końcu zawsze ucieka. Myślę jednak, że pozostałe „zwroty” wcale nie są uruchamiane. W wielu postach znalazłem fakt, że w końcu napisałem treść nad tym, co już napisano w klauzuli catch. Rozumiem, że jak tylko wartość zwrotna w klauzuli catch ma być oceniana, przepływ sterowania przechodzi do klauzuli final, która z kolei ma kolejny zwrot, tym razem zwrot zostanie oceniony bez przekazywania kontroli z powrotem do klauzuli catch . W ten sposób jedynyreturn
wywołane w czasie wykonywania będzie w końcu powrotu. Zgadzasz się z tym
A return
wfinally
nie przekazuje kontroli do programu, ale zwraca wartość i kończy metodę. Czy możemy tak powiedzieć?