Visualizzazione dei risultati da 1 a 4 su 4
  1. #1
    Utente di HTML.it
    Registrato dal
    Dec 2006
    Messaggi
    95

    Contare il numero di occorrenze di un'array di oggetti

    Dentro alla classe Disco ho private Brano[] brani. Nella classe Disco ho questa funzione
    codice:
        public int dimensione(){
    
    
            /*
            for(c=0; c<brani.length;c++)
                if(!brani[c].equals(null)){
                    System.out.println("incremento d");
                    d++;
                }
            */
            
            
            int c=-1,d=0;
            System.out.println("brani.length "+brani.length);        
            while (!(brani[c+1].equals(null))) { //linea 98
                c++;
                d++;
                System.out.println("incremento d, ora vale "+d);
    
    
            }
            
            return d;
            
        }
    che richiamo dal file TestCd in quetso modo
    codice:
    System.out.println("Dimensione: "+cd.dimensione()); //linea 73
    Il problema è che restituisce il numero di brani presenti ma nella console compare
    codice:
    java.lang.NullPointerException
        at classi.CompactDisc.dimensione(CompactDisc.java:98)
        at classi.TestCD.main(TestCD.java:73)
    e non stampa la println del Test.

  2. #2
    Utente di HTML.it L'avatar di Alex'87
    Registrato dal
    Aug 2001
    residenza
    Verona
    Messaggi
    5,802
    Senza guardare alla correttezza della logica del codice, se brani[c+1] contiene null brani[c+1].equals(null) scoppia.

    Il controllo di non nullità si fa in modo più semplice: if (brani[c+1] != null) { ... }

    Comunque un for al posto del while sarebbe più comodo qui... E per favore inizia a usare dei nomi migliori: c e d sono terribili (non si capisce cosa contengano)
    Ultima modifica di Alex'87; 13-03-2016 a 15:32
    SpringSource Certified Spring Professional | Pivotal Certified Enterprise Integration Specialist
    Di questo libro e degli altri (blog personale di recensioni libri) | ​NO M.P. TECNICI

  3. #3
    Utente di HTML.it L'avatar di andbin
    Registrato dal
    Jan 2006
    residenza
    Italy
    Messaggi
    18,284
    Quote Originariamente inviata da Rudie Visualizza il messaggio
    codice:
            while (!(brani[c+1].equals(null))) { //linea 98
    Innanzitutto questo equals non ha granché senso (anzi quasi nulla). Innanzitutto bisogna vedere se nella classe Brano hai ridefinito equals oppure no. Se non l'hai fatto, resta il equals ereditato da Object, che si basa solo sul confronto dei reference dei due oggetti (il this e l'argomento di equals).

    Se è il equals di Object, brani[c+1].equals(null) in teoria vorrebbe concettualmente dire: true se brani[c+1] è null. Ma attenzione: se brani[c+1] è null, allora NON potresti invocarci equals! Ed è questo che non ha senso.

    Inoltre la specifica di equals dice chiaramente che con x.equals(null), equals deve (dovrebbe) restituire sempre false.

    Passiamo oltre: se hai un Brano[] istanziato di una capacità inizialmente maggiore di quanto subito serve, la cosa più semplice e logica sarebbe quella di tenere una variabile che indica il numero "logico" di elementi (questo è ciò che fanno Vector/ArrayList ad esempio).
    Se invece intendevi qualcosa del tipo: gli elementi terminano quando nell'array c'è un null .... beh sì, si può tecnicamente fare ma è più complicato da gestire e testare.

    Consiglio: ripensa un pochino la gestione dell'array.
    Andrea, andbin.devSenior Java developerSCJP 5 (91%) • SCWCD 5 (94%)
    java.util.function Interfaces Cheat SheetJava Versions Cheat Sheet

  4. #4
    Utente di HTML.it
    Registrato dal
    Dec 2006
    Messaggi
    95
    Quote Originariamente inviata da Alex'87 Visualizza il messaggio
    Il controllo di non nullità si fa in modo più semplice: if (brani[c+1] != null) { ... }

    Comunque un for al posto del while sarebbe più comodo qui... E per favore inizia a usare dei nomi migliori: c e d sono terribili (non si capisce cosa contengano)
    Con la condizione brani[c+1]!=null funziona, grazie Alex!
    Sulle variabili hai perfettamente ragione ma su questo spesso uso nomi corti, poi quando il programma funziona mi adeguo: c per contatore e d per dimensione comunque.

    Quote Originariamente inviata da andbin Visualizza il messaggio
    Innanzitutto questo equals non ha granché senso (anzi quasi nulla). Innanzitutto bisogna vedere se nella classe Brano hai ridefinito equals oppure no. Se non l'hai fatto, resta il equals ereditato da Object, che si basa solo sul confronto dei reference dei due oggetti (il this e l'argomento di equals).

    Se è il equals di Object, brani[c+1].equals(null) in teoria vorrebbe concettualmente dire: true se brani[c+1] è null. Ma attenzione: se brani[c+1] è null, allora NON potresti invocarci equals! Ed è questo che non ha senso.
    Meno male che i compilatori non mi possono insultare!
    mmm, fare l'@Override delle funzioni mi incuriosisce (per ora lo faccio solo sul toString): appena ho tempo ci provo.

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 © 2025 vBulletin Solutions, Inc. All rights reserved.