Avatar billede jakoba Nybegynder
15. august 2003 - 06:47 Der er 8 kommentarer og
1 løsning

Hvorfor får jeg ikke aktiveret den exception ?

Jeg har følgende lille testprogram:

/* ------------- file  ThrowEpx.java
**
** test effect of exeptions thrown in the constructor
*/

class ThrowEpx {
   
    static Testit[] TestArr = new Testit[13];
   
    public static void main ( String[] args ) {
        for ( int i=0; i<TestArr.length; i++ ) {
            try {
                TestArr[i] = new Testit();
            } catch( Exception e ) {
                System.out.println( e.getMessage() );
            }
            if ( TestArr[i] != null ) {
                System.out.println( "recieved instance " +i );
            } else {
                System.out.println( "no reciept of instance " +i );
            }
        }
    } //endfunction main
   
} //endclass ThrowEpx


class Testit {
    static int myNumber;
    int instanceNumber; 

    public Testit( ) throws Exception {
        try {
            myNumber++;              // throws exception when no defined value in myNumber
        } catch( Exception e ) {
            System.out.println( "myNumber is undefined" );
            myNumber = 0;            // so give the value 0 to the very first instance
        }
        if ( myNumber >= 10 ) {      // max 10 instances may be created
            throw new Exception( "failed to create instance nr " +myNumber );
        }
        instanceNumber = myNumber;
        System.out.println( "succecfully created instance nr " +instanceNumber );
    } // end constructor

} //endclass Testit

Ideen er at allerførte gang constructoren Testit() bliver kaldt er den statiske variabel myNumber udefineret så der bliver kastet en exception når når den prøver at udføre linien:
            myNumber++;              // throws exception when no defined value in myNumber
men der bliver ikke kastet nogen exception, det er somom varabelen bliver født med værdien 0 ???

mvh JakobA
Avatar billede bearhugx Nybegynder
15. august 2003 - 08:09 #1
Hmmm ... Jeg tror at primitiver bliver tildelt en default-værdi (0), når de optræder i static context -- jeg lavede en lille test, og hvis int definitionen var inde i public static void main (psvm) metoden, så kunne jeg ikke kompilere med fejlen :
D:\Dev\Source>javac -classpath . TestInt.java
TestInt.java:4: variable i might not have been initialized
                System.out.println(i);
                                  ^
1 error


flyttede jeg derimod int definitionen ud af psvm, så virkede det med det samme - men hvor int i var defaultet til 0...

så jeg lavede en lille test .. for at se, hvad primitiver defaulter til --

class TestDefaultPrimitives {
    static boolean b;
    static char c;
    static double d;
    static float f;
    static int i;

    public static void main(String[] args) {
        System.out.println("Default boolean = "+b);
        System.out.println("Default char    = "+c);
        System.out.println("Default double  = "+d);
        System.out.println("Default float  = "+f);
        System.out.println("Default int    = "+i);
    }
}

OUTPUT blev :
D:\Dev\Source>java -cp . TestDefaultPrimitives
Default boolean = false
Default char    =
Default double  = 0.0
Default float  = 0.0
Default int    = 0


Jeg tror den eneste måde at du rent faktisk kan bestemme om et heltal ikke er sat er ved at arbejde med Integer objekter - og så teste på null...

/Søren
Avatar billede arne_v Ekspert
15. august 2003 - 08:37 #2
Objekter er reelt en referance som svarer til en pointer. Og den
kan derfor have en null værdi.

Simple data typer er bare værdier og de kan ikke have en null værdi.

Og når nu simple data typer skal have en værdi så er numerisk nul
jo en meget fornuftig default værdi !
Avatar billede erikjacobsen Ekspert
15. august 2003 - 08:46 #3
Og man kan ikke på en simpel variabel, på runtime, se om den
er initialiseret eller ej (der er altid et bitmønster, og det
repræsenterer altid en værdi af en slags), og derfor kan der
ikke opstå en exception. Det er derfor Java er sådan efter
os på compiletime...
Avatar billede arne_v Ekspert
15. august 2003 - 08:51 #4
Det er endda specifificeret i Java Language Specification
hvad værdierne skal være.

Se:
  http://java.sun.com/docs/books/jls/second_edition/html/typesValues.doc.html#96595
Avatar billede arne_v Ekspert
15. august 2003 - 08:52 #5
(men derfor synes jeg alligevel at man skal bruge eksplicit assignment)
Avatar billede jakoba Nybegynder
15. august 2003 - 14:32 #6
Enig, men formålet her er jo det underlige at få kastet de exceptions. Så jeg lavede myNumbet til et Integer ovjekt som bearhugx foreslår, og ny kører den perfekt:

class Testit {
    static Integer myNumber;
    int instanceNumber; 

    public Testit( ) throws Exception {
        try {
            instanceNumber = myNumber.intValue();  // throws exception when no defined value in myNumber
        } catch( Exception e ) {
            System.out.println( "myNumber is undefined" );
            myNumber = new Integer( 0 );      // so give the value 0 to the very first instance
        }
        myNumber = new Integer( instanceNumber+1 );
        if ( instanceNumber >= 10 ) {        // max 10 instances may be created
            throw new Exception( "failed to create instance nr " +instanceNumber );
        }
        System.out.println( "succecfully created instance nr " +instanceNumber );
    } // end constructor

} //endclass Testit

Og der er altså reelt ikke nogen runtimechexk på om variable er initieret, det var jo godt at finde ud af. ( jeg kan godt se det ville være dyrt som bare den i runtimetid, men når det nu er Java :-))

Takker.  Vil i klikke i svarknappen så jeg kan lukke?

mvh JakobA
Avatar billede erikjacobsen Ekspert
15. august 2003 - 14:37 #7
Det er nemlig at det vil være dyrt. Derfor compilecheck, og
beskeden: might not have been initialized

(ingen point til mig tak)
Avatar billede arne_v Ekspert
15. august 2003 - 14:44 #8
svar
Avatar billede jakoba Nybegynder
19. august 2003 - 08:53 #9
takker
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