1. Indiferent dacă există o excepție sau o excepție, codul din blocul final va fi executat; 2. Când există întoarcere în încercare și prindere, în final tot va fi executat; 3. În final este executat după operația de expresie după returnare (în acest moment, valoarea după operație nu este returnată, dar valoarea de returnat este salvată prima, indiferent de codul din final, valoarea returnată nu se va schimba, chiar dacă este valoarea salvată anterior), astfel încât valoarea returnată a funcției este determinată înainte de execuția finală; 4. Este mai bine să nu incluzi return în final, altfel programul va ieși mai devreme, iar valoarea returnării nu este valoarea returnată salvată în încercare sau prindere. Exemplu:
Situația 1:try{} catch(){}finally{} return;
Se pare că procedura se desfășoară în ordine.
Situația 2:try{ return; }catch(){} finally{} return;
Programul execută codul înainte de return în blocul try (inclusiv operația de expresie în instrucțiunea return);
apoi execută blocul final și în final execută returnarea în try;
în final block return, pentru că programul a returnat în try, deci nu mai este executat.
Situația 3:try{ } catch(){return; } în sfârșit{} return;
Programul execută try primul, iar dacă întâlnește o excepție, execută blocul de prindere,
Dacă există o excepție, se execută codul înainte de return (inclusiv operația de expresie din instrucțiunea return) în catch, apoi se execută tot codul din afirmația finală.
În final, execută returnarea în blocul de prindere. După ce în cele din urmă, codul din 4 locuri nu va mai fi executat.
Fără excepție: Execută, încearcă și apoi în cele din urmă returnează.
Situația 4:try{ return; }catch(){} în sfârșit{return; }
Programul execută codul înainte de return în blocul try (inclusiv operația de expresie în instrucțiunea return);
Apoi execută blocul final, pentru că există return în blocul final, deci ieși mai devreme.
Cazul 5:try{} catch(){return; }finally{return; }
Programul execută codul înainte de return (inclusiv operațiunile de expresie din instrucțiunea return) în blocul de prindere;
Apoi execută blocul final, pentru că există return în blocul final, deci ieși mai devreme.
Situația 6:try{ return; }catch(){return; } în sfârșit{return; }
Programul execută codul înainte de return în blocul try (inclusiv operația de expresie în instrucțiunea return);
Există o excepție: execută codul înainte de return (inclusiv operația de expresie din instrucțiunea return) în blocul de captură;
Apoi execută blocul final, pentru că există retur în blocul final, deci iese mai devreme.
Fără excepție: apoi execută din nou blocul final și ieși mai devreme pentru că există retur în blocul final.
Concluzie finală: Orice instrucțiune return în try sau catch este executată înainte de afirmația finală, dacă există în cele din urmă.
Dacă există o revenire în final, atunci programul va returna, deci returnarea în finally va fi cu siguranță returnată.
Compilatorul implementează returnarea în finally ca avertisment.
|