Avatar billede gladmhensk Nybegynder
11. februar 2004 - 16:43 Der er 13 kommentarer og
1 løsning

Exceptions i java

Hey !
Jeg har lige et par spørgsmål om exceptions: 


1. Hvornår skal man skrive "....throwable Exception......" ved definitionen af en metode ? er det når der ikke bruges try-catch ?

2. Hvad bruges "throw e;" til i slutningen af en catch block ?
____________________________________________________
3. Se kode nedenunder....Hvorfor kommer System.err.println op på skærmen først ? De bliver jo kaldt til sidst



public class PlusInteger {
   
public void Kald(){
    try{
   
    System.out.println("Metode 1 - Uden fejl, men med catch block");
    Fejl();
   
    } catch(ArithmeticException e){
    System.err.println("Fail detected");
}

}



public void Fejl(){
    System.err.println("Metode 2");
    int j = 2;
    for(int i = 0; i >= -0; i--)
    System.out.println(j/i);
   
}
   
   
   
    public static void main(String[] args) {
        PlusInteger Objektet = new PlusInteger();
       
        Objektet.Kald();

    }
}
Avatar billede arne_v Ekspert
11. februar 2004 - 16:46 #1
1)

Man skal skrive "throws XyzException" i metode erklæringen, hvis:
  - den kan smide den exception
  - den ikke catcher den
  - XyzException ikke extender RuntimeException
Avatar billede arne_v Ekspert
11. februar 2004 - 16:48 #2
2)

} catch (XyzException ex) {
    System.out.println("Vi fik en Xyz");
    throw e;
}

catcher en XyzException men smider den igen d.v.s. at eneste forskel
på ikke at catche den og dette er at man får den linie skrevet ud.

Jeg vil frarråde den slags konstruktioner i langt de fleste tilfælde.
Avatar billede arne_v Ekspert
11. februar 2004 - 16:51 #3
3)

Output hos mig er:

Metode 1 - Uden fejl, men med catch block
Metode 2
Fail detected

Hvilker set meget logisk ud.

Men den første skrive til System.out mens de andre skrives til System.err - jeg
har før oplevet at System.out bufferes mens System.err ikke gør det. D.v.s.
at de 2 sidste kan godt snige sig op foran den første, hvis den bliver
bufferet.
Avatar billede arne_v Ekspert
11. februar 2004 - 16:52 #4
Og et svar.
Avatar billede gladmhensk Nybegynder
11. februar 2004 - 16:58 #5
Hmm, har ikke helt fattet spm. 2 endnu :/ kan du lave et kort eksempel eller er det avanceret ?`

Okay, bare weird det virker hos dig og ikke mig...bruger pt. eclipse...kan det gøre noget ?
Avatar billede arne_v Ekspert
11. februar 2004 - 17:03 #6
Jeg bruger også Eclipse !

:-)

Men det kunne skyldes at jeg bruger Java 1.3.1 og du bruger 1.4.2 eller
at du bruger P4 og jeg P III eller at jeg bruger Windows og du Linux eller
717 andre ting.

Man kan ikke regne med at System.out.println og System.err.println er
synkroniserede medmindre man kalder System.out.flush().
Avatar billede arne_v Ekspert
11. februar 2004 - 17:07 #7
Eksempel:

public class ExEx {
    public static void f() throws Exception { // because it rethrows
        try {
            throw new Exception("Arne exception"); // throw new exception
        } catch (Exception e) { // catch exception
            System.out.println("Oops: " + e); // print exception
            throw e; // rethrow same exception
        }
    }
    public static void main(String[] args) throws Exception {
        f();
    }
}

men jeg synes som sagt ikke at det er nogen heldig konstruktion.
Avatar billede arne_v Ekspert
11. februar 2004 - 17:07 #8
Det hænder at man har brug for at catche en type execption og så throwe en
anden type exception !
Avatar billede gladmhensk Nybegynder
11. februar 2004 - 17:08 #9
Okay (Du er 10 min fra at få 60 point :)).
Hvornår skal jeg så bruge err.println istedet for out.println ?

PS. SPM 2 har jeg stadgivæk problemer med...
Avatar billede gladmhensk Nybegynder
11. februar 2004 - 17:09 #10
aaah....så jeg kan kaste en anden type exception inde i catch blokken som bliver grebet af en anden catch block ?
Avatar billede gladmhensk Nybegynder
11. februar 2004 - 17:13 #11
hmm...tester lige koden...
Avatar billede arne_v Ekspert
11. februar 2004 - 17:16 #12
Meningen er at man bruger System.out til ikke-fejl og System.err til fejl.

Det er noget som Java har arvet fra C og som derfor går tilbage til 1970 !

Til små programmer gør det normalt ikke så meget.

Til større programmer kan alligevel anbefales at bruge et logging
framework.
Avatar billede arne_v Ekspert
11. februar 2004 - 17:17 #13
Ja - det hænder at man laver en Xyz klasse og en XyzException klasse og så lader
alle metoder i Xyz catche evt. exceptions og throwe en XyzException i.s.f.
for at give et interface der er uafhængigt af implementationen.
Avatar billede gladmhensk Nybegynder
11. februar 2004 - 17:17 #14
Okay....der kommer vist noget mere om rethrow senere i bogen ellers må jeg spørge igen :)
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