15. august 2003 - 06:47Der 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 ???
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;
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...
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?
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.