Hi zusammen,
habe eine eher spezielle Frage, welche ich keinem Unterforum direkt zuordnen konnte, daher habe ich das Thema mal hier aufgemacht.
Es geht darum, dass ich den Ablauf im Bytecode bei der Initialisierung der Konstanten in der java/lang/System.class nicht ganz nachvollziehen kann. Ich beziehe mich hierbei auf die Version in JAVA 1.6 (die genaue Versionsbezeichnung weiß ich genau).
Bei der Initialisierungsmethode für dir Konstanten wird z.B. die Methode "nullInputStream" aufgerufen:
Hier wird zuerst die aktuelle Systemzeit in Millisekunden (eine von 0 verschiedene positive Zahl, z.B. 1234) und anschließend die Konstante 0 auf den Stack geladen. Der Nächste OpCode (LCMP) soll nun diese Zahlen vergleichen (siehe HIER). Auf dem Stack liegen also nun als value2 die 0 und als value1 die 1234. Nach Aussage der Befehlsreferenz ist das Ergebnis demnach -1, da value2 kleiner ist als value1. Auf den Stack wird nun also die -1 gelegt.
der nächste OpCode (IFLE) führt nun einen Branch aus, wenn der auf dem Stack liegende Wert kleiner ist als 0. Da der oberste Wert auf dem Stack ja die -1 ist wird nun dieser Branch ausgeführt und anschließend eine Exception geworfen.
Mein Problem ist nun, dass ich das ganze für arg unlogisch halte, da diese Methode ja eigentlich ausgeführt werden muss, bevor mit System.out.println("...") ein String auf die Konsole gezaubert wird, hierbei jedoch nie eine Exception geworfen wird.
Habe ich den Bytecode nun falsch interpretiert, oder habe ich irgendwo etwas übersehen.
Für eure Hilfe wäre ich wirklich sehr dankbar.
habe eine eher spezielle Frage, welche ich keinem Unterforum direkt zuordnen konnte, daher habe ich das Thema mal hier aufgemacht.
Es geht darum, dass ich den Ablauf im Bytecode bei der Initialisierung der Konstanten in der java/lang/System.class nicht ganz nachvollziehen kann. Ich beziehe mich hierbei auf die Version in JAVA 1.6 (die genaue Versionsbezeichnung weiß ich genau).
Bei der Initialisierungsmethode für dir Konstanten wird z.B. die Methode "nullInputStream" aufgerufen:
Java:
0 invokestatic #329 <java/lang/System.currentTimeMillis>
3 lconst_0
4 lcmp
5 ifle 10 (+5)
8 aconst_null
9 areturn
10 new #155 <java/lang/NullPointerException>
13 dup
14 invokespecial #307 <java/lang/NullPointerException.<init>>
17 athrow
Hier wird zuerst die aktuelle Systemzeit in Millisekunden (eine von 0 verschiedene positive Zahl, z.B. 1234) und anschließend die Konstante 0 auf den Stack geladen. Der Nächste OpCode (LCMP) soll nun diese Zahlen vergleichen (siehe HIER). Auf dem Stack liegen also nun als value2 die 0 und als value1 die 1234. Nach Aussage der Befehlsreferenz ist das Ergebnis demnach -1, da value2 kleiner ist als value1. Auf den Stack wird nun also die -1 gelegt.
der nächste OpCode (IFLE) führt nun einen Branch aus, wenn der auf dem Stack liegende Wert kleiner ist als 0. Da der oberste Wert auf dem Stack ja die -1 ist wird nun dieser Branch ausgeführt und anschließend eine Exception geworfen.
Mein Problem ist nun, dass ich das ganze für arg unlogisch halte, da diese Methode ja eigentlich ausgeführt werden muss, bevor mit System.out.println("...") ein String auf die Konsole gezaubert wird, hierbei jedoch nie eine Exception geworfen wird.
Habe ich den Bytecode nun falsch interpretiert, oder habe ich irgendwo etwas übersehen.
Für eure Hilfe wäre ich wirklich sehr dankbar.