Visualizzazione dei risultati da 1 a 10 su 10
  1. #1

    [Java] java.lang.ArrayStoreException

    Secondo un esempio fatto in aula il seguente codice dovrebbe passare al compilatore ma darmi l'eccezzione "ArrayStoreException" in run-time, ma non riesco a capire il perchè.

    codice:
    Fruit[] fruit = new apple [10];
    fruit[0] = new Apple();
    fruit[1] = new Jonathan();
    
    fruit[0] = new Fruit();
    fruit[0] = new orange();
    Ovvero, secondo la lezione le prime due righe non danno problmei, benchè la seconda è di un tipo diverso da apple che non ha nulla a che vedere (quindi già qui la dimensione dovrebbe essere diversa), il problema secondo le slide sovrebbe essere nelle ultime righe.

    Sapete indicamri da cosa dipende?

    Vi ringrazio in anticipo,
    Neptune.
    "Estremamente originale e fantasioso" By darkiko;
    "allora sfiga crepuscolare mi sa che e' meglio di atmosfera serale" By NyXo;
    "per favore, già è difficile con lui" By fcaldera;
    "se lo apri te e invece di "amore" ci metti "lavoro", l'effetto è lo stesso" By fred84

  2. #2
    Avrei anche un'altro dubbio, ovvero che differenza c'è tra il metodo istanceof ed il metodo isistance?
    "Estremamente originale e fantasioso" By darkiko;
    "allora sfiga crepuscolare mi sa che e' meglio di atmosfera serale" By NyXo;
    "per favore, già è difficile con lui" By fcaldera;
    "se lo apri te e invece di "amore" ci metti "lavoro", l'effetto è lo stesso" By fred84

  3. #3
    Moderatore di Programmazione L'avatar di LeleFT
    Registrato dal
    Jun 2003
    Messaggi
    17,328
    Originariamente inviato da Neptune
    codice:
    Fruit[] fruit = new apple [10];
    fruit[0] = new Apple();
    fruit[1] = new Jonathan();
    
    fruit[0] = new Fruit();
    fruit[0] = new orange();
    Direi che le slide non sono per nulla chiare.
    La prima istruzione, quella di creazione dell'array, non ha alcun problema. Creo un array che potrà contenere 10 oggetti Apple e lo vedo come un array che contiene 10 oggetti Fruit. Apple è un Fruit: tutto ok.

    La seconda, assegna al primo elemento un oggetto Apple. Nessun problema
    La terza genera un ArrayStoreException perchè non posso assegnare ad un elemento di un array di Fruit un oggetto di un tipo che non sia un Fruit.
    La quarta genera un ArrayStoreException perchè, sebbene io veda un array di Fruit, quello che ho realmente è un array di Apple. Siccome "Fruit" può essere un oggetto qualunque (anche un Orange), non posso assegnarlo ad una posizione di un array fatto per contenere solo Apple.
    La quinta, come la precedente, genera un ArrayStoreException perchè sto proprio commettendo l'errore descritto sopra: assegno un Orange ad un array atto a contenere Apple.

    Originariamente inviato da Neptune
    Avrei anche un'altro dubbio, ovvero che differenza c'è tra il metodo istanceof ed il metodo isistance?
    Nessuna differenza: la documentazione del metodo isInstance() della classe Class dice che tale metodo è esattamente equivalente all'operatore instanceof.

    This method is the dynamic equivalent of the Java language instanceof operator
    PS: instanceof è un operatore, non un metodo.


    Ciao.
    "Perchè spendere anche solo 5 dollari per un S.O., quando posso averne uno gratis e spendere quei 5 dollari per 5 bottiglie di birra?" [Jon "maddog" Hall]
    Fatti non foste a viver come bruti, ma per seguir virtute e canoscenza

  4. #4
    Originariamente inviato da LeleFT
    Direi che le slide non sono per nulla chiare.
    La prima istruzione, quella di creazione dell'array, non ha alcun problema. Creo un array che potrà contenere 10 oggetti Apple e lo vedo come un array che contiene 10 oggetti Fruit. Apple è un Fruit: tutto ok.

    La seconda, assegna al primo elemento un oggetto Apple. Nessun problema
    La terza genera un ArrayStoreException perchè non posso assegnare ad un elemento di un array di Fruit un oggetto di un tipo che non sia un Fruit.
    La quarta genera un ArrayStoreException perchè, sebbene io veda un array di Fruit, quello che ho realmente è un array di Apple. Siccome "Fruit" può essere un oggetto qualunque (anche un Orange), non posso assegnarlo ad una posizione di un array fatto per contenere solo Apple.
    La quinta, come la precedente, genera un ArrayStoreException perchè sto proprio commettendo l'errore descritto sopra: assegno un Orange ad un array atto a contenere Apple.



    Nessuna differenza: la documentazione del metodo isInstance() della classe Class dice che tale metodo è esattamente equivalente all'operatore instanceof.



    PS: instanceof è un operatore, non un metodo.


    Ciao.
    Daccordo per le linee di codice, mentre per istanceof che significa che è l'equivalente dinamico? cioè che mi cambia dall'utilizzo di uno all'utilizzo dell'altro?
    "Estremamente originale e fantasioso" By darkiko;
    "allora sfiga crepuscolare mi sa che e' meglio di atmosfera serale" By NyXo;
    "per favore, già è difficile con lui" By fcaldera;
    "se lo apri te e invece di "amore" ci metti "lavoro", l'effetto è lo stesso" By fred84

  5. #5
    Moderatore di Programmazione L'avatar di LeleFT
    Registrato dal
    Jun 2003
    Messaggi
    17,328
    Originariamente inviato da Neptune
    Daccordo per le linee di codice, mentre per istanceof che significa che è l'equivalente dinamico? cioè che mi cambia dall'utilizzo di uno all'utilizzo dell'altro?
    Cambia che il primo è un operatore, mentre il secondo è un metodo di una classe.

    Il primo si usa così:

    codice:
    if (mioOggetto instanceof MiaClasse) {
       ...
    }
    Il secondo, del tutto equivalente, si usa così:

    codice:
    if ( MiaClasse.class.isInstance(mioOggetto) ) {
       ...
    }
    L'uso del metodo è l'unico modo per poter effettuare questo genere di confronti quando il nome della classe da testare non è noto a tempo di compilazione, ma solo in esecuzione (dynamic). Supponiamo che il nome della classe tu ce l'abbia in una stringa letta da riga di comando e vuoi sapere se un determinato oggetto è una classe di quel tipo, come fai? Il primo metodo non lo puoi usare perchè il nome della classe tu non ce l'hai. Devi usare il secondo, costruendo prima l'oggetto Class tramite reflection:

    codice:
    String nomeDellaClasse = ...;
    Class<?> tipo = Class.forName( nomeDellaClasse );
    if ( tipo.isInstance(tuoOggetto) ) {
       ...
    }
    Ciao.
    "Perchè spendere anche solo 5 dollari per un S.O., quando posso averne uno gratis e spendere quei 5 dollari per 5 bottiglie di birra?" [Jon "maddog" Hall]
    Fatti non foste a viver come bruti, ma per seguir virtute e canoscenza

  6. #6
    Originariamente inviato da LeleFT
    Cambia che il primo è un operatore, mentre il secondo è un metodo di una classe.

    Il primo si usa così:

    codice:
    if (mioOggetto instanceof MiaClasse) {
       ...
    }
    Il secondo, del tutto equivalente, si usa così:

    codice:
    if ( MiaClasse.class.isInstance(mioOggetto) ) {
       ...
    }
    L'uso del metodo è l'unico modo per poter effettuare questo genere di confronti quando il nome della classe da testare non è noto a tempo di compilazione, ma solo in esecuzione (dynamic). Supponiamo che il nome della classe tu ce l'abbia in una stringa letta da riga di comando e vuoi sapere se un determinato oggetto è una classe di quel tipo, come fai? Il primo metodo non lo puoi usare perchè il nome della classe tu non ce l'hai. Devi usare il secondo, costruendo prima l'oggetto Class tramite reflection:

    codice:
    String nomeDellaClasse = ...;
    Class<?> tipo = Class.forName( nomeDellaClasse );
    if ( tipo.isInstance(tuoOggetto) ) {
       ...
    }
    Ciao.

    Ah ecco quindi la differenza tra saperlo in compile time ed in run-time è che nel primo caso, ovvero con istanceof, il nome della classe lo devi avere già ben scritto. Nel secondo caso, con isistance, il nome della classe lo puoi contenere in una variabile di tipo string e quindi avvalorarlo in runtime.
    Ho capito bene?
    "Estremamente originale e fantasioso" By darkiko;
    "allora sfiga crepuscolare mi sa che e' meglio di atmosfera serale" By NyXo;
    "per favore, già è difficile con lui" By fcaldera;
    "se lo apri te e invece di "amore" ci metti "lavoro", l'effetto è lo stesso" By fred84

  7. #7
    Moderatore di Programmazione L'avatar di LeleFT
    Registrato dal
    Jun 2003
    Messaggi
    17,328
    Originariamente inviato da Neptune
    Ah ecco quindi la differenza tra saperlo in compile time ed in run-time è che nel primo caso, ovvero con istanceof, il nome della classe lo devi avere già ben scritto. Nel secondo caso, con isistance, il nome della classe lo puoi contenere in una variabile di tipo string e quindi avvalorarlo in runtime.
    Ho capito bene?
    Sì.
    Il discorso è un po' più ampio, comunque il concetto è quello.
    Se la classe di cui testare l'oggetto la conosci già puoi usare instanceof. Se non la conosci a priori, ma solo a runtime, dovrai usare il metodo isInstance() della classe Class.

    Prevengo già una domanda, che solitamente salta fuori in questo caso.
    Se il nome della classe ce l'ho già in un oggetto String, perchè usare isInstance() su un oggetto di tipo Class, quando potrei fare semplicemente

    codice:
    String nomeClasse = ...;
    if ( mioOggetto.getClass().getName().equals(nomeClasse) ) {
       ...
    }
    ?

    Risposta: il test effettuato dall'operatore instanceof e dal metodo isInstance() ha un significato diverso da quello proposto nel codice sopra.
    Il codice sopra controlla che un determinato oggetto sia esattamente del tipo specificato da "nomeClasse", mentre l'operatore instanceof ed il metodo isInstance() controllano che un determinato oggetto sia compatibile in assegnamento con il tipo specificato per il confronto.

    codice:
    JPanel mioPannello = new JPanel();
    Il test evidenziato nel codice ritornerà true se e solo se la stringa "nomeClasse" avrà valore "javax.swing.JPanel". Usando l'operatore instanceof o il metodo isInstance() si avrà true anche per qualunque superclasse di JPanel e per qualunque interfaccia implementata da tale classe o sue superclassi.

    Ciao.
    "Perchè spendere anche solo 5 dollari per un S.O., quando posso averne uno gratis e spendere quei 5 dollari per 5 bottiglie di birra?" [Jon "maddog" Hall]
    Fatti non foste a viver come bruti, ma per seguir virtute e canoscenza

  8. #8
    stavo provando il seguente codice sull'RTTI e non riesco a capacitarmi come mai nella condizione si va sempre nell'else e mi viene restituito "NO!".

    codice:
            Integer k = new Integer(20);
            Object i = new Integer(10);
            Object istance = i.getClass();
            System.out.println(istance);
            System.out.println(k.getClass());
           
           
            if(k.getClass().isInstance(istance))
                System.out.println("Ok!");
            else
                System.out.println("NO!");
    La motivazione può essere che nel codice su scritto istance diviene un istanza di Class, e nel toString mi viene restituito la classe a cui appartiene i, mentre k è un istanza di integer?

    ma quindi il corretto uso di isIstance è del tipo:

    codice:
    miooggetto.getClass().isIstance(oggetto);
    dove oggetto sarà per l'appunto un oggetto e non una classe?

    Mentre se utilizzo istanceof un utilizzo appropriato potrebbe essere del tipo:
    codice:
            Object i = new Integer(10);
            if(i instanceof String)
                System.out.println("Ok!");
            else
                System.out.println("NO!");
    Ovvero ho un oggetto generico, ovvero di tipo object e voglio sapere se per caso è del tipo String.

    La differenza tra i due, a parte che isistance è un metodo di class e che istanceof invece è un operatore, è che con istanceof devo specificare subito il tipo con cui voglio effettuare il controllo, mentre con un isistance, prendendo l'esempio di sopra, l'oggetto "istance" può cambiare al runtime?

    Però mentre in istanceof io posso specificare direttamente una classe per vedere se quell'oggetto è istancza di quella determinata classe, con isistance io devo passargli un oggetto, cioè non posso fare un:
    codice:
    k.getClass().isInstance(Integer);
    mi da errore in compile-time, devo a forza passargli un'altro oggetto, ovvero isistance mi fa confrontare grossomodo due oggetti e mi dice se sono istanza della stessa classe mentre ad istanceof posso sapere direttamente se un oggetto è istanza di una classe che gli passo. O sbaglio?

    Ho provato anche a sviluppare un esempio per quel che riguarda il meccanismo di rilfessione:

    codice:
    package Pack;
    
    import java.lang.reflect.Method;
    
    public class rtti {
        public void prova(){}
        public static void main(String[] args)
        {
            try {
                Class c = Class.forName("rtti");
                Method[] m = c.getMethods();
                for(int j=0; j < m.length; j++)
                {
                    System.out.println(m[j]);
                }
            } catch (ClassNotFoundException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }
        }
    }
    Però mi da una ClassNotFoundException benchè si tratta della classe della prova stessa. Ho provato anche a dare Integer come class e mi da sempre lo stesso errore. Da cosa potrebbe dipendere?
    "Estremamente originale e fantasioso" By darkiko;
    "allora sfiga crepuscolare mi sa che e' meglio di atmosfera serale" By NyXo;
    "per favore, già è difficile con lui" By fcaldera;
    "se lo apri te e invece di "amore" ci metti "lavoro", l'effetto è lo stesso" By fred84

  9. #9
    Originariamente inviato da Neptune
    stavo provando il seguente codice sull'RTTI e non riesco a capacitarmi come mai nella condizione si va sempre nell'else e mi viene restituito "NO!".
    codice:
            Integer k = new Integer(20);
            Object i = new Integer(10);
            Object istance = i.getClass();
            System.out.println(istance);
            System.out.println(k.getClass());
           
           
            if(k.getClass().isInstance(istance))
                System.out.println("Ok!");
            else
                System.out.println("NO!");
    La motivazione può essere che nel codice su scritto istance diviene un istanza di Class
    In pratica, verifichi se una istanza della classe Integer è istanza della classe Class. Ovviamente la risposta è no.

    Originariamente inviato da Neptune
    ma quindi il corretto uso di isIstance è del tipo:
    codice:
    miooggetto.getClass().isIstance(oggetto);
    dove oggetto sarà per l'appunto un oggetto e non una classe?

    Mentre se utilizzo istanceof un utilizzo appropriato potrebbe essere del tipo:
    codice:
            Object i = new Integer(10);
            if(i instanceof String)
                System.out.println("Ok!");
            else
                System.out.println("NO!");
    Ovvero ho un oggetto generico, ovvero di tipo object e voglio sapere se per caso è del tipo String.
    Si, esatto.

    N.B. il metodo si chiama isInstance.

    Originariamente inviato da Neptune
    Però mentre in istanceof io posso specificare direttamente una classe per vedere se quell'oggetto è istancza di quella determinata classe, con isistance io devo passargli un oggetto, cioè non posso fare un:
    codice:
    k.getClass().isInstance(Integer);
    mi da errore in compile-time
    isInstance vuole una istanza di una classe, non il nome di una classe.
    Quindi, ad esempio:
    codice:
    k.getClass().isInstance( new Integer(1) );
    Originariamente inviato da Neptune
    Ho provato anche a sviluppare un esempio per quel che riguarda il meccanismo di rilfessione:

    codice:
    package Pack;
    
    import java.lang.reflect.Method;
    
    public class rtti {
        public void prova(){}
        public static void main(String[] args)
        {
            try {
                Class c = Class.forName("rtti");
                Method[] m = c.getMethods();
                for(int j=0; j < m.length; j++)
                {
                    System.out.println(m[j]);
                }
            } catch (ClassNotFoundException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }
        }
    }
    Però mi da una ClassNotFoundException benchè si tratta della classe della prova stessa. Ho provato anche a dare Integer come class e mi da sempre lo stesso errore. Da cosa potrebbe dipendere?
    Il nome corretto della classe è:
    Pack.rtti
    perchè è posizionata all'interno del package Pack.

  10. #10
    Grazie mi sei stato molto d'aiuto, mi hai totlo una marea di dubbi in un colpo solo
    "Estremamente originale e fantasioso" By darkiko;
    "allora sfiga crepuscolare mi sa che e' meglio di atmosfera serale" By NyXo;
    "per favore, già è difficile con lui" By fcaldera;
    "se lo apri te e invece di "amore" ci metti "lavoro", l'effetto è lo stesso" By fred84

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2026 vBulletin Solutions, Inc. All rights reserved.