Visualizzazione dei risultati da 1 a 8 su 8
  1. #1
    Utente di HTML.it
    Registrato dal
    Feb 2010
    Messaggi
    6

    Aiutoooo... java.lang.NullPointerException??

    Ciao a tutti!
    Qualcuno saprebbe dirmi perché il seguente programma non funziona lanciandomi un eccezione?

    class TestaPilaList{
    public static void main(String[] op ){
    PilaList list = new PilaList();
    for(int i = 0; i < 12; i++){
    list.aggiungiElemento(Integer.toString(i));
    list.stampa();
    }
    for(int i = 0; i < 6; i++){
    list.eliminaElemento();
    list.stampa();
    }
    }
    }

    import java.util.ArrayList;
    class PilaList{
    public PilaList(){
    ArrayList<String> pila = new ArrayList<String>();
    }
    public void eliminaElemento(){
    pila.remove(pila.size()-1);
    }
    public void aggiungiElemento(String elemento){
    pila.add(elemento);
    }
    public void stampa(){
    for(int i = 0; i < pila.size(); i++){
    System.out.print("|"+pila.get(i)+"|");
    }
    System.out.println("");
    }
    private ArrayList<String> pila;
    }

    eccezione:
    java.lang.NullPointerException
    at PilaList.aggiungiElemento(PilaList.java:10)
    at TestaPilaList.main(TestaPilaList.java:5)

    mentre modificando la costruzione dell'oggetto pila come di seguito funziona...

    class TestaPilaList{
    public static void main(String[] op ){
    PilaList list = new PilaList();
    for(int i = 0; i < 12; i++){
    list.aggiungiElemento(Integer.toString(i));
    list.stampa();
    }
    for(int i = 0; i < 6; i++){
    list.eliminaElemento();
    list.stampa();
    }
    }
    }

    import java.util.ArrayList;
    class PilaList{
    public PilaList(){
    pila = new ArrayList<String>(); /* <-- MODIFICA, PRIMA ERA: ArrayList<String> pila = new ArrayList<String>(); */
    }
    public void eliminaElemento(){
    pila.remove(pila.size()-1);
    }
    public void aggiungiElemento(String elemento){
    pila.add(elemento);
    }
    public void stampa(){
    for(int i = 0; i < pila.size(); i++){
    System.out.print("|"+pila.get(i)+"|");
    }
    System.out.println("");
    }
    private ArrayList<String> pila;
    }

    vi prego, è tutto il pomeriggio che sto impazzendo! La stessa cosa mi è accaduta su un programma simile solo con gli array classici!

    Grazie

  2. #2
    Utente di HTML.it
    Registrato dal
    Feb 2005
    Messaggi
    356
    Ciao, proverò a spiegarti.
    L'errore è molto semplice e cercherò di essere il più chiaro possibile. Perdonami se non ci riuscirò.

    Quando dichiari un attributo in una classe, nel tuo caso hai dichiarato
    codice:
    private ArrayList<String> pila;
    all'interno della classe accedi a quell'attributo attraverso
    codice:
    this.pila
    oppure solo attraverso il nome dell'attributo.

    Nel tuo primo esempio,
    nel costruttore tu fai
    codice:
    public PilaList() {
          ArrayList<String>  pila = new ArrayList<String>();
        }
    ovvero dichiari un'altra variabile di tipo ArrayList<String> che si chiama pila.
    Questo dichiarazione varrà solamente all'interno della funzione in cui è fatta, (in questo caso il costruttore) e non varrà al di fuori di essa.
    In questo caso quindi, la variabile di nome pila verrà creata all'interno del costruttore, andando peraltro a nascondere un attributo, ma al suo esterno non verrà vista.
    Nel frattempo l'attributo della classe, denominato pila, non ha subito nessuna inizializzazione. Ecco perchè quando poi viene richiamato nel metodo aggiungiElemento() solleva l'eccezione nullPointerException, perchè si accede ad un elemento che non esiste.

    Nel secondo caso invece, nel costruttore fai
    codice:
    public PilaList() {
            pila = new ArrayList<String>();
        }
    in questo caso quindi vai a inizializzare l'attributo della classe.
    Lo inizializzi all'interno del costruttore, ma esso rimarrà utilizzabile per tutto il ciclo di vita dell'oggeto.
    Ecco perchè, quando poi lo vai a usare nel metodo aggiungiElemento, non ti da nessun problema.

    Spero di essere stato chiaro,
    nel caso, chiedi pure quello che ti serve
    Jekkil

  3. #3
    Utente di HTML.it
    Registrato dal
    Feb 2010
    Messaggi
    6
    Grazie, sei stato chiarissimo. Ancora una cosa ti chiederò:
    Quindi qual'è il contesto in cui bisogna utilizzare ArrayList<String> pila = new ArrayList<String>(); piuttosto che pila = new ArrayList<String>();? Visto che nel primo caso, da quello che ho capito, potrei utilizzarlo unicamente dichiarandolo nel metodo in cui lo utilizzo; giusto?

    Grazie!

  4. #4
    Utente di HTML.it
    Registrato dal
    Feb 2005
    Messaggi
    356
    Se devi istanziare un attributo della classe, farai

    pila = new ArrayList<String>();

    Lo puoi fare nel costruttore o in qualunque altro metodo della classe

    Se invece vuoi usare una variabile solo all'interno di un metodo allora userai

    ArrayList<String> pila = new ArrayList<String>();

    che avrà validità solo all'interno del metodo.
    Ma in questo caso, per evitare complicazioni, ti consiglio di usare un nome diverso da quello dell'attributo della classe. Prendila come una buona regola da seguire sempre.
    Così facendo però non istanzierai l'attributo della classe che quindi non potrà essere usato dagli altri metodi.
    Jekkil

  5. #5
    Utente di HTML.it
    Registrato dal
    Feb 2010
    Messaggi
    6
    Ok, perfetto. La differenza che intercorre tra le due è quindi, trovando un'analogia, la stessa che può esserci tra una variabile dichiarata all'interno di un metodo e una dichiarata come "campo di esemplare"... giusto?

    Grazie!!!

  6. #6
    Utente di HTML.it
    Registrato dal
    Feb 2005
    Messaggi
    356
    non è la stessa....è proprio quella
    Jekkil

  7. #7
    Utente di HTML.it
    Registrato dal
    Feb 2010
    Messaggi
    6
    Ottimo... e pensare che ho passato un intero pomeriggio per cercare di capire una cosa che già sapevo ...
    Grazie mille!

    Ciao

  8. #8
    Moderatore di Programmazione L'avatar di LeleFT
    Registrato dal
    Jun 2003
    Messaggi
    17,328

    Moderazione

    In futuro, oltre ad utilizzare titoli conformi al regolamento (questo è stato corretto dal mio collega), cerca anche di usare i tag CODE quando posti del codice.

    Vedi il regolamento interno, al punto 6.


    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

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.