Avatar billede Bennysørensen Praktikant
29. oktober 2003 - 18:16 Der er 31 kommentarer og
1 løsning

Deklarering af egen exception

Jeg har set andre eksempler hvor denne slags kode virker, så hvorfor gør MIN ikke? Det er vigtigt at der bruges "throws" som en del af funtionsdeklareringen

public void setMonth(int month) throws IllegalMonthException
    {
        this.month = month;

        if ( ( month > 13 ) || (month < 1) )
        {
            throw new IllegalMonthException("Ulovlig maaned.");
        }
    }

class IllegalMonthException extends Exception
{
    public IllegalMonthException(String text)
    {
        super();
    }
}

...og jeg får:

unreported exception legeplads.opg8.IllegalMonthException; must be caught or declared to be thrown
        test.setMonth(12);
            ^
1 error
Avatar billede repsak Nybegynder
29. oktober 2003 - 18:19 #1
det er fordi at du skal skrive
try{
test.setMonth(12);
}
catch(IllegalMonthException e){
}
Avatar billede erikjacobsen Ekspert
29. oktober 2003 - 18:26 #2
I dit tilfælde "plejer" man blot at bruge IllegalArgumentException - men
man kan bestemt også lave sin egen.
Avatar billede repsak Nybegynder
29. oktober 2003 - 18:29 #3
iøvrigt bør du nok skrive
class IllegalMonthException extends Exception{
    public IllegalMonthException(String text){
        super(text);
    }
}
Avatar billede Bennysørensen Praktikant
29. oktober 2003 - 18:40 #4
Well, det kan også lade sig gøre UDEN at bruge try-catch, og det er det jeg gerne vil opnå: Jeg HAR lavet et glimrende eksempel med try-catch.
Avatar billede erikjacobsen Ekspert
29. oktober 2003 - 18:55 #5
Så skal du jo

  void enellerandenmetode() throws IllegalMonthException {

      test.setMonth(12);

  }

...men du skubber bare problemet
Avatar billede repsak Nybegynder
29. oktober 2003 - 19:04 #6
jeg vil gerne se det uden try catch ;-) - medmindre at du gør som Erik siger
Avatar billede repsak Nybegynder
29. oktober 2003 - 19:07 #7
du kan også skrive

public void setMonth(int month){
        this.month = month;

        if ( ( month > 13 ) || (month < 1) ){
            throw new IllegalMonthException("Ulovlig maaned.");
        }
    }

men hvis exception optræder går programmet ned med et brag. Du slipper ikke for try-catch
Avatar billede arne_v Ekspert
29. oktober 2003 - 19:24 #8
Hvis en metoder er erklæret til at smide en Exception kan man enten
have try catch omkring kaldet eller erklære den kaldende metode
til at smide den pågældende exception (og det kan gentages helt ud til main).
Avatar billede arne_v Ekspert
29. oktober 2003 - 19:25 #9
repsak>

Jeg tror ikke at får den kode til at compile.

Hvis metoden smider en exception så skal den enten catches eller
erklæres.
Avatar billede repsak Nybegynder
29. oktober 2003 - 19:27 #10
Jeg har lige compilet. Det går forrygende :-)
Avatar billede arne_v Ekspert
29. oktober 2003 - 19:33 #11
Et eller andet må være forskelligt mellem din og min kode !

C:\>type Ex.java
public class Ex {
        public static void main(String[] args) {
                throw new MyException("test");
        }
}

class MyException extends Exception {
        public MyException(String s) {
                super(s);
        }
}
C:\>javac Ex.java
Ex.java:3: unreported exception MyException; must be caught or declared to be th
rown
                throw new MyException("test");
                ^
1 error
Avatar billede arne_v Ekspert
29. oktober 2003 - 19:34 #12
Du er ikke "kommet til" at bruge:
  extends RuntimeException
?
Avatar billede repsak Nybegynder
29. oktober 2003 - 19:40 #13
public final class b {
    public void setMonth(int month){
        if ( ( month > 13 ) || (month < 1) ){
            throw new IllegalArgumentException("Ulovlig maaned.");
        }
    }

    public static void main(String args[]){
        new b();
    }
}

Dette virker fint, men hvorfor virker det ikke hvis jeg laver min egen Exception???
Avatar billede repsak Nybegynder
29. oktober 2003 - 19:42 #14
hov dette var meningen, men det virker også

public static void main(String args[]){
  new b().setMonth(2);
}
Avatar billede arne_v Ekspert
29. oktober 2003 - 19:49 #15
IllegalArgumentException extender RuntimeException !!!!
Avatar billede arne_v Ekspert
29. oktober 2003 - 19:50 #16
Hvis nogen skulle være i tvivl:
  RuntimeException og exceptions om extender den behøver ikke at blive
  catchet/erklæret
Avatar billede repsak Nybegynder
29. oktober 2003 - 19:55 #17
Ahhh I see - jeg fulgte bare Eriks råd og der virker jo lidt smartere (hvis man som spørgeren vil undgå try/catch)
Avatar billede arne_v Ekspert
29. oktober 2003 - 20:01 #18
Det er nok nødvendigt hvis man vil undgå try catch.

Men som hoved regel bør runtime exceptions kun smides for
software fejl (og hardware fejl) - aldrig for bruger fejl.

Så jeg er ikke sikker på at jeg ville bruge den her.
Avatar billede arne_v Ekspert
29. oktober 2003 - 20:02 #19
Noget helt andet.

Skal:

if ( ( month > 13 ) || (month < 1) )

ikke være:

if ( ( month > 12 ) || (month < 1) )

?
Avatar billede erikjacobsen Ekspert
29. oktober 2003 - 20:06 #20
Men det er vel en softwarefejl at en metode kaldes med forkerte
argumenter, så derfor er en IllegalArgumentException en runtimeexception.

Dækker månedstesten over et helt almindeligt test for korrekt indtastet
input fra en bruger, ville jeg slet ikke bruge en exception.
Avatar billede arne_v Ekspert
29. oktober 2003 - 20:31 #21
Det afhænger jo lidt af hvordan koden er og hvordan fejl håndterings
strategien er.

Jeg er stadig ikke overbevist.
Avatar billede erikjacobsen Ekspert
29. oktober 2003 - 20:45 #22
Hver sin smag. En exception er en undtagelse der kan bryde normal
programudførelse. En test for at et tal ligger mellem 1 og 12 er
er almindelig programstump. Der er ingen grund til at oprette et
nyt objekt af den grund, og skjule den logiske tankegang i koden

... syn's jeg.
Avatar billede Bennysørensen Praktikant
29. oktober 2003 - 23:24 #23
Hm....jeg skal vist vænne mig til at skrive "1. dette er en opgave i forbindelse med mit studie" og "2. Jeg har ikke selv bestemt den"...det er som sagt vigtigt at der bruges throws i metodedeklareringen. Hvorvidt det er smart at lave det på den måde skal jeg ikke blande mig i...men jeg undrer mig over at så mange af de ellers venligt mente kommentarer overser det.
Det er ikke for at være sur.

Arne_v, kan du give forklaringen på hvorfor min kode så ikke virker, når du selv fortæller at man kan erklære den kaldende metode
til at smide den pågældende exception uden at bruge try-catch?
Venligst
Anders Schrøder
Avatar billede arne_v Ekspert
29. oktober 2003 - 23:28 #24
Hvis metode har en
  throws XxxxException

så må du enten putte en try catch omkring kaldet af metode *eller*
lade den kaldende metode throwe samme exception.
Avatar billede erikjacobsen Ekspert
29. oktober 2003 - 23:35 #25
Og det sagde vi kl. 18.19 og 18.55 ;)

Selv om det er en skoleopgave må vi vel godt kommentere rimeligheden i det,
så du ved lidt om hvad du ville gøre i den virkelige verden.

Nu kan du jo spørge din lærer om det er en fornuftig måde generelt at
checke input på, og om man ikke lige så godt kunne klare sig med
IllegalArgumentEx..  -  og hvad man ellers skal gøre hvor og hvornår.
Avatar billede Bennysørensen Praktikant
29. oktober 2003 - 23:45 #26
Som jeg sagde: Det er ikke for at være sur. Men jeg prøver jo netop at throwe en exception i min kode, og det lykkes ikke. Jeg forstår stadig ikke hvorfor, men regner heller ikke mig selv for at være specielt smart.

Min lærer har såmænd ikke bestemt hvordan jeg skal lave eksemplet...jeg har selv valgt noget nemt.
Avatar billede Bennysørensen Praktikant
29. oktober 2003 - 23:53 #27
Indrømmet, nu har jeg fået det til at virke med en IllegalArgumentExeption. Jeg er dog stadig ikke smart nok til at se forskellen på mine to klasser, der kaldes i den ene eller den anden metode:
import java.util.*;

public class Dato
{
    int day=0, month=0;
   
    public void setDay( int day )
    {
        try
        {
            this.day = day;
           
            if ( (day < 1) || (day > 31) )
            { 
                IllegalDayException id = new IllegalDayException();
                throw id;
            } 
       
        }
        catch (IllegalDayException i)
        {
            System.out.println( day + " er ikke en lovlig dag.");
        }
    }
    public void setMonth(int month) throws IllegalArgumentException
    {
        this.month = month;
        System.out.println(month);
        if ( ( month > 12 ) || (month < 1) )
        {
            throw new IllegalArgumentException();
        }
    }
   
    public static void main (String args[])
    {
        Dato test = new Dato();
        test.setDay(32);
        test.setMonth(13);
    }
}



class IllegalDayException extends Exception
{
    public IllegalDayException()
    {
       
    }
}
class IllegalMonthException extends Exception
{
    public IllegalMonthException(String text)
    {
        super();
    }
}

...tak for hjælpen, anyway. Repsak er den eneste, der har svaret, men jeg vil helst give point til ErikJacobsen, da han satte mig på sporet af IllegalArgumentException...
Avatar billede erikjacobsen Ekspert
30. oktober 2003 - 08:51 #28
På sporet måske ... Det vil være ret fornuftigt at fortælle hvad der
går galt:

  throw new IllegalArgumentException("Hey man, du der - kun 12 måneder i et år!");
Avatar billede arne_v Ekspert
30. oktober 2003 - 08:57 #29
IllegalArgumentException extenderRuntimeException og behøver derfor ikke
catches/erklæres.

IllegalDayException extender Exception ikke RuntimeException. og skal
derfor catches/throwes.
Avatar billede Bennysørensen Praktikant
30. oktober 2003 - 11:54 #30
Ok, Arne_v's sidste kommentar giver jo svaret på mit spørgsmål..dét havde jeg aldrig selv kunnet regne ud. Tak for det.

...hvem har lyst til at svare i stedet for at kommentere, så jeg kan komme af med nogle points?
Avatar billede arne_v Ekspert
30. oktober 2003 - 11:58 #31
repsak har allerede svaret

jeg svarer her

så mangler du kun at få et svar ud af erik
Avatar billede erikjacobsen Ekspert
30. oktober 2003 - 12:35 #32
ingen point, tak
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