Avatar billede nielsbrinch Nybegynder
04. februar 2002 - 10:32 Der er 8 kommentarer og
1 løsning

Hvorfor finally?

Her er en typisk opbygning af try-catch og med finally til sidst - det har de fleste programmører set, men jeg forstår ikke hvorfor man skal have finally.

try
{
    System.out.println("Try");
}
catch (Exception e)
{
    System.out.println("Catch");
}
finally
{
    System.out.println("Finally");
}       
System.out.println("Efter");

Output af ovenstående er:

Try
Finally
Efter

Den skriver både Finally og Efter på - begge ting udføres fuldstændig uafhængigt af noget som helst andet - det er vanvid ... VANVID! siger jeg ...

Hvorfor skal man bruge finally, hvis det har samme effekt bare skrive koden efter man har catch'et?
Avatar billede disky Nybegynder
04. februar 2002 - 10:38 #1
nej det er nemlig skide genialt.

det som står i 'finally {}' er du sikker på bliver afviklet.

f.eks.

i din

try{} forsøger du at åbne en en fil og derefter læse fra den.
Din catch fanger så en eventuel IOException der måtte opstå.

I din finally{} lukker du så filen igen, på denne måde er du sikret den altid lukkes ligegyldigt om der sker en exception eller ej.

Du kan se på den lidt ligesom en destructor i C++
Avatar billede kresten Nybegynder
04. februar 2002 - 10:39 #2
Yep, disky har ret... læs evt mere om det på http://www.javaworld.com/javaworld/jw-02-1997/jw-02-hood.html
Avatar billede puppetmaster Nybegynder
04. februar 2002 - 10:40 #3
Øøøøøøh, yes?
Programmet kører jo videre efter at "finally" er udført.......hvorved det næste bliver udført, med mindre der sker en "forgrening" i "finally"
Finally bruges til at "rydde op", så som at lukke filer, netforbindelser osv.
Avatar billede nielsbrinch Nybegynder
04. februar 2002 - 10:46 #4
Men du kan også bare rydde op efter finally - det har samme effekt, da begge ting bliver udført uanset hvad...

Er der nogen situation hvor det er en fordel at sætte noget kode i finally, i stedet for bare at skrive det løst efter den sidste catch?
Avatar billede lbhansen Nybegynder
04. februar 2002 - 11:45 #5
hvis du fx i din catch{} smider en anden exception videre, så vil alt derefter ikke blive kaldt, medmindre det står i en finally
Avatar billede jnrohde Nybegynder
07. februar 2002 - 21:21 #6
Hvis din kode i try{} blokken kaster en exception vil koden efter try-catch-finally IKKE blive udført. Derfor skal vigtig kode som lukning af filer, netforbindelser osv. skrives i finally-blokken for derved at sikre at det vil blive udført SELVOM at der kastes en exception.
Avatar billede jnrohde Nybegynder
07. februar 2002 - 21:25 #7
Ok, jeg skrev lidt forkert..det jeg menter er at når der kastes en exception i try-blokken vil resten af try blokken ikke blive udført hvorfor vigtig kode puttes i finally blokken.
Avatar billede nielsbrinch Nybegynder
07. februar 2002 - 21:32 #8
Men den vigtige kode kan lige så godt være efter finally-blokken i dit eksempel, jnrohde
Avatar billede jnrohde Nybegynder
07. februar 2002 - 22:13 #9
Emh, nej. Der er to tilfælde hvor det ikke er sandt:

1. Hvis catch-blokken kaster en "ny" excpetion vil koden i finally-blokken blive udført, men det vil koden efter try-catch-finally IKKE.

2. Hvis der ikke er en catch-blok for den kastede exceoption vil den pågældende exception blive givet til den kaldende metode EFTER at koden i finally-blokken er udført. Derimod vil kode efter try-catch-finally IKKE blive udført.
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Kurser inden for grundlæggende programmering

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester