Visualizzazione dei risultati da 1 a 10 su 10
  1. #1
    Utente di HTML.it L'avatar di goatboy
    Registrato dal
    Mar 2011
    residenza
    Salerno
    Messaggi
    408

    [JAVA] Problema "null pointer exception"

    Questo codice mi da un "null pointer exception". Da quanto ho capito vuol dire che c'è qualcosa che sta a null, ma non capisco proprio cosa:

    codice:
    public class Libreria {
        private String codice, autore, titolo;
        private boolean cod;
        private String vet[]=new String[100];
        private int i, dim=0;
        
        /**
         * Metodo costruttore.
         * Inserisce il libro solo se il codice è corretto e non è già presente in libreria.
         * Altrimenti imposta tutto a null.
         */
        public Libreria(String codice, String autore, String titolo) {
            cod=controllaCodice(codice);
            if(cod==true){
                this.codice=codice;
                this.autore=autore;
                this.titolo=titolo;
                vet[dim]=codice;
                dim++;
            }else{
                System.out.println("Codice errato o autore già presente in elenco!");
                this.codice=null;
                this.autore=null;
                this.titolo=null;
            }
        }
        
        /**
         * Restituisce vero se il codice è giusto.
         * Restituisce false se il codice è di lunghezza errata o è già presente.
         */
        private boolean controllaCodice(String codice) {
            if(codice.length()!=6){
                return false; // Codice di lunghezza errata
            }else{
                for(i=0; i<vet.length; i++){
                    if(vet[i].equals(codice)){
                        return false; // Codice già presente in archivio
                    }
                }
                return true; // Codice corretto
            }
        }
        
        @Override
        public String toString() {
            return "Codice: "+codice+", Autore: "+autore+", Titolo: "+titolo+"\n";
        }
        
    }
    Questo è il main:

    codice:
    public class Main {
        public static void main(String[] args) {
            Libreria lib;
            String str;
            
            lib=new Libreria("AA2457", "Autore 1", "Titolo di prova");
            str=lib.toString();
            System.out.println(str);
            
            lib=new Libreria("AB1265", "Autore 2", "Titolo di prova");
            str=lib.toString();
            System.out.println(str);
            
            lib=new Libreria("AC1586", "Autore 3", "Titolo di prova");
            str=lib.toString();
            System.out.println(str);
            
            lib=new Libreria("AD98123", "Autore 4", "Titolo di prova");
            str=lib.toString();
            System.out.println(str);
            
            lib=new Libreria("AC1586", "Autore 5", "Titolo di prova");
            str=lib.toString();
            System.out.println(str);
            
        }
    }
    Please help me

  2. #2
    Utente di HTML.it
    Registrato dal
    Feb 2007
    Messaggi
    4,157
    da un'occhiata rapida non ci vedo grossissimi problemi, posta l'intero stack trace
    RTFM Read That F*** Manual!!!

  3. #3
    Utente di HTML.it L'avatar di goatboy
    Registrato dal
    Mar 2011
    residenza
    Salerno
    Messaggi
    408
    Originariamente inviato da valia
    da un'occhiata rapida non ci vedo grossissimi problemi, posta l'intero stack trace
    Mi da l'errore alla riga

    codice:
    if(vet[i].equals(codice))

  4. #4
    Utente di HTML.it
    Registrato dal
    Nov 2009
    Messaggi
    755
    non ho analizzato a fondo il tuo codice ma credo che l'errore stia nei null che hai all'interno dellarray "vet":
    nel metodo "controllaCodice" che tu richiami come prima istruzione nel costruttore di "Libreria" vai a controllare l'uguaglianza delle stringhe contenute nel vettore con quelle all'interno di codice , ma il vettore "vet" è stato si istanziato ma non inizializzato..


    con questo codice
    codice:
    private String vet[]=new String[100];
    tu allochi la memoria per l'array ma i suoi elementi , poichè non inizializzati , saranno tutti impostati a null..ed ecco spiegata perchè l'eccezione


  5. #5
    Utente di HTML.it L'avatar di goatboy
    Registrato dal
    Mar 2011
    residenza
    Salerno
    Messaggi
    408
    Originariamente inviato da zipangulu
    non ho analizzato a fondo il tuo codice ma credo che l'errore stia nei null che hai all'interno dellarray "vet":
    nel metodo "controllaCodice" che tu richiami come prima istruzione nel costruttore di "Libreria" vai a controllare l'uguaglianza delle stringhe contenute nel vettore con quelle all'interno di codice , ma il vettore "vet" è stato si istanziato ma non inizializzato..


    con questo codice
    codice:
    private String vet[]=new String[100];
    tu allochi la memoria per l'array ma i suoi elementi , poichè non inizializzati , saranno tutti impostati a null..ed ecco spiegata perchè l'eccezione

    E quindi come risolvo ? Non so proprio

  6. #6
    Utente di HTML.it
    Registrato dal
    Nov 2009
    Messaggi
    755
    Originariamente inviato da goatboy
    E quindi come risolvo ? Non so proprio
    E che ne so io?
    Saprai tu che codici deve contenere quell'array , di conseguenza riempilo con quei codici

  7. #7
    Utente di HTML.it L'avatar di goatboy
    Registrato dal
    Mar 2011
    residenza
    Salerno
    Messaggi
    408
    Originariamente inviato da zipangulu
    E che ne so io?
    Saprai tu che codici deve contenere quell'array , di conseguenza riempilo con quei codici
    Ma io lo voglio inizializzare proprio con quei valori. Infatti nel costruttore scrivo vet[i]=codice..

  8. #8
    Utente di HTML.it
    Registrato dal
    Nov 2009
    Messaggi
    755
    mmm no credo tu abbia strutturato male il tuo programma:
    ogni istanza di libreria avrà una sua varibile di istanza "vet" , ciò significa che ogni istanza avrà un vettore a sè , diverso..
    Secondo me il progetto andrebbe così composto:
    -le classi "strutturali" , Libreria e Libro
    -una classe di avvio programma , Main

    1)La classe Libreria avrà come attributo un array di Libri di dimensione fissa n nel caso in cui vuoi che essa abbia una capienza massima di n libri , una lista in modo da poter contenere un numero indefinito di libri.
    Tra le opzioni sopra trattate io sceglierei la seconda , usare una lista , poichè la gestione degli array seppur più intuitiva è in alcuni casi , come quando lo si vuole ridimensionare , più complessa rispetto all'utilizzo di una lista che gestisce tutto da sè in background.
    In alternativa , e sarebbe probabilmente la scelta migliore ma anche più difficile poichè devi conoscere un po' di SQL , potresti usare un database.
    Inoltre poi puoi aggiungere metodi di gestione della libreria.
    2)La classe Libro sarà caratterizzata dagli attributi codice , titolo , autore e quanti altri tu vorrai , e i metodi "getter" e "setter" per rispettivamente ottenere e settare determinati attributi di un'istanza di Libro.

    Giusto per dare un'idea farei qualcosa del genere (è proprio terra terra per farti capire):

    classe Libreria:

    codice:
    import java.util.LinkedList;
    
    class Libreria {
    
    	private LinkedList<Libro> l;
    
    	public Libreria () {
    		l = new LinkedList<Libro> ();
    	}
    
    	public void aggiungiLibro (Libro libro) {
    		l.add (libro);
    	}
    
    	public boolean rimuoviLibro (Libro libro) {
    		return l.remove (libro); //restituisce false ad esempio se il libro nn c'è
    	}
    
    	public boolean contieneLibro (Libro libro) {
    		return l.contains (libro);
    	}
    
    	public int getDimensioneLibreria () {
    		return l.size ();
    	}
    
    }

    classe Libro:

    codice:
    class Libro {
    
    	private String codice , titolo , autore;
    
    	public Libro (String c , String t , String a) {
    		codice = c;
    		titolo = t;
    		autore = a;
    	}
    
    	public String getCodice () {
    		return codice;
    	}
    
    	public String getTitolo () {
    		return titolo;
    	}
    
    	public String getAutore () {
    		return autore;
    	}
    
    }
    classe Main:

    codice:
    class Main {
    
    	public static void main (String [] args) {
    		Libreria lib = new Libreria ();
    		Libro l1 = new Libro ("123456" , "Il conte di Montecristo" , "Zipangulu");
    		Libro l2 = new Libro ("654321" , "Il libro di Tizio" , "Tizio");
    		Libro l3 = new Libro ("012345" ,  "Dammi un titolo" , "Caio");
    		lib.aggiungiLibro (l1);
    		System.out.println ("La libreria contiene " + lib.getDimensioneLibreria () + " libro/i");
    		lib.aggiungiLibro (l2);
    		lib.aggiungiLibro (l3);
    		System.out.println ("La libreria contiene " + lib.getDimensioneLibreria () + " libro/i");
    
    	}
    
    }
    Spero di aver reso l'idea.


  9. #9
    Utente di HTML.it L'avatar di goatboy
    Registrato dal
    Mar 2011
    residenza
    Salerno
    Messaggi
    408
    Be che dire, grazie mille. Anche io cominciavo a pensare di aver strutturato male il problema. Ora ho capito dove sbagliavo. Grazie

  10. #10
    Basta che sostituisci questo:

    codice:
    if(vet[i].equals(codice)){
    con questo:

    codice:
    if(vet[i]!=null && vet[i].equals(codice)){
    Ho fatto questo perché ogni variabile di istanza se non specificato esplicitamente viene inizializzata al valore iniziale proprio nullo, per tutti i reference è null per un int è 0, essendo String comunque un oggetto allora l'array vet è una lista di reference e visto che non inizializzi le istanze il valore che gli viene settato è automaticamente null questo implica che quando chiami il metodo controlloCodice siccome vet ha tutto settato a null il controllo vet[i].equals(codice) da' un nullpointer in quanto è come se java facesse questo controllo null.equals(codice) che non è possibile in quanto il valore è null, quindi prima di passare al controllo con il metodo equals fai semplicemente un'altro controllo per verificare che vet[i] non sia null e le due && servono proprio per fare in modo che se vet[i] è null il controllo non viene fatto e l'if viene saltato direttamente.

    Nota anche che quando inizializzi dim usi:
    codice:
    private static int i, dim = 0;
    ma è superfluo inizializzare esplicitamente dim a 0 dato che lo fa' automaticamente java essendo una variabile di instanza.
    Forza Napoli!

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.