Newsgroup: it.comp.java
Titolo: errore del bytecode verifier?

Ciao,
sto giocando con il jdk 1.5 x imparare le novità rispetto all'1.4
Nelle mie prove mi sono imbattuto in un pezzetto di codice che compila,
ma genera una VerifyError in esecuzione.
*****************CUT HERE*****************
public class BadEnum
{
    enum EnumWithBehaviour {
        XXX("Xxxxxxx", "Xxx", "X") { public boolean hasChildren() {
return true;} },
        YYY("Yyyyyyyyy", "Yyyyy", "Y") { public boolean hasChildren() {
return false;} };
        abstract public boolean hasChildren();
        private String itsName;
        private String itsSurname;
        private String itsNickname;
        private EnumWithBehaviour(String name, String surname, String
nickname)
        {
            itsName = name;
            itsSurname = surname;
            itsNickname = nickname;
        }
        public String greet()
        {
            return "Hello, I am "+itsName+" "+itsSurname+ " (aka
"+itsNickname+")";
        }
    };
    public static void main(String[] args)
    {
        for (EnumWithBehaviour l:EnumWithBehaviour.values())
            System.out.println(l+": "+l.greet());
    }
}
*****************CUT HERE*****************
L'errore che ottengo è il seguente:
Exception in thread "main" java.lang.VerifyError: (class:
BadEnum$EnumWithBehaviour, method: <init> signature:
(Ljava/lang/String;ILjava/lang/String;Ljava/lang/String;Ljava/lang/String;LBadEnum$EnumWithBehaviour;)V)
Register 2 contains wrong type
	at BadEnum.main(BadEnum.java:30)
NB: sono su wintel
java version "1.5.0_02"
Java(TM) 2 Runtime Environment, Standard Edition (build 1.5.0_02-b09)
Java HotSpot(TM) Client VM (build 1.5.0_02-b09, mixed mode)
Da notare che se butto via la definizione di hasChildren o se riduco i
parametri del costruttore (come nella versione successiva) a una
stringa sola il tutto funziona.
*****************CUT HERE*****************
public class GoodEnum
{
    enum EnumWithBehaviour {
        XXX("Xxxxxxx") { public boolean hasChildren() { return true;}
},
        YYY("Yyyyyyyyy") { public boolean hasChildren() { return
false;} };
        abstract public boolean hasChildren();
        private String itsName;
        private EnumWithBehaviour(String name)
        {
            itsName = name;
        }
        public String greet()
        {
            return "Hello, I am "+itsName+" and I do "+(hasChildren() ?
"" : "not ")+"have children";
        }
    };
    public static void main(String[] args)
    {
        for (EnumWithBehaviour l:EnumWithBehaviour.values())
            System.out.println(l+": "+l.greet());
    }
}
*****************CUT HERE*****************
Può essere uno dei buchi del bytecode verifier o sono io che sto
sbagliando qualcosa?
Grazie
AA

 
A me compila e funziona sulla 03:
C:\TEMP>"\Program Files\Java\jdk1.5.0_03\bin\java.exe" -version
java version "1.5.0_03"
Java(TM) 2 Runtime Environment, Standard Edition (build 1.5.0_03-b07)
Java HotSpot(TM) Client VM (build 1.5.0_03-b07, mixed mode, sharing)
C:\TEMP>"\Program Files\Java\jdk1.5.0_03\bin\javac.exe" BadEnum.java
C:\TEMP>"\Program Files\Java\jdk1.5.0_03\bin\java.exe" BadEnum
XXX: Hello, I am Xxxxxxx Xxx (akaX)
YYY: Hello, I am Yyyyyyyyy Yyyyy (akaY)
--
Marco

Quindi potrebbe proprio essere un bachetto del verifier della 02 ...
peccato che sia difficilmente verificabile perchè i bug del verifier
non sempre vengono mantenuti nel bug database e dando una scorsa veloce
non ho trovato nulla in
http://java.sun.com/j2se/1.5.0/ReleaseNotes.html#150_03
 che possa
chiarire se è un problema fissato o meno.
Grazie mille, comunque, mi scaricherò la 03 e proverò.
Ciao
AA

enum e' una parola chiave dalla 1.5 in la... non e' che fa le bizze per
questo?
-- 
---
Francesco Galli / Cinghiale Mannaro
Personal: 
http://cinghialemannaro.splinder.com
TMS project: 
http://tms.inera.it

Uh? Ma infatti io sto istanziando degli enum ... ma forse non ho capito
la tua considerazione, ti puoi spiegare meglio?
AA

Enum e' una parola chiave a partire dal jdk 1.5 in la'. Non e' che sono
quelli che ti fanno le bizze? magari stai compilando con l'opzione di
"retrocompatibilità" per il jdk1.4 e eseguendo con l'1.5 schietto. Per cui
non ti segnala bizze in compilazione ma te le segnala in esecuzione.
