Visualizzazione dei risultati da 1 a 6 su 6
  1. #1
    Utente di HTML.it
    Registrato dal
    Oct 2003
    Messaggi
    1,258

    [java] un errore con i puntatori

    ciao a tutti,
    ho un array di puntatori, e ogni elemento punta a una serie di liste concatenate.
    codice:
     
    public void aggiungiValori(){
          Node p = arrayOfcols[2];
          arrayOfcols[2] = new Node(2,3,4);
          System.out.println(p.value);
      }
    l'ultima istruzione di questa breve procedura mi da nullpointerexception in esecuzione...non riesco a capire.
    se sostituisco al posto di p.value...arrayOfcols[2].value
    tutto funziona. Come mai arrayOfcols e p non li posso usare
    come sinonimi? Mi pare che in C, facessi cosi

  2. #2
    Utente di HTML.it
    Registrato dal
    Oct 2003
    Messaggi
    1,258
    seconda cosa strana che noto:

    questo programma stampa correttamente p != null

    codice:
    public void aggiungiValori(){
    
          arrayOfcols[2] = new Node(2,3,4);
          Node p = arrayOfcols[2];
          if(p != null) System.out.println("p è diverso da null!");
      }
    questo programma invece non stampa nulla...ma come è possibile? (ho solo invertito due istruzioni)

    codice:
      
      public void aggiungiValori(){
          Node p = arrayOfcols[2];
          arrayOfcols[2] = new Node(2,3,4);
          if(p != null) System.out.println("p è diverso da null!");
      }
    se puo servire, riporto il codice completo, ma non dovrebbe essere troppo difficile al limite ricostruirsi una cosa simile.

  3. #3
    Utente di HTML.it L'avatar di Angelo1974
    Registrato dal
    Feb 2003
    Messaggi
    1,107
    Ciao; be' a giudicare dal comportamento di cui parli secondo me tu crei un array di Node ma non lo valorizzi e cioè fai una ocsa del tipo:

    codice:
    Node[] arrayOfcols = null;
    oppure (supponendo una dimensione pari a 10):

    codice:
    Node[] arrayOfcols = new Node[10];
    Be' in entrambi i casi tutti gli elementi dell'array sono ancora null; infatti la VM capisce solo che deve preparare spazio per una array di elementi Node, ma non gli hai detto quali sono i reali valori (nel secondo caso sei stato solo + dettagliato dicendole che lo spazio da riservare è per un array di dieci elementi); allora cosa succede nei metodi che hai scritto? Nel primo caso, e cioè:

    Codice PHP:
    public void aggiungiValori(){

          
    arrayOfcols[2] = new Node(2,3,4);
          
    Node p arrayOfcols[2];
          if(
    != nullSystem.out.println("p è diverso da null!");
      } 
    Tu prendi un elemento dell'array dichiarato in precedenza (in particolare l'elemento alla terza posizione), lo crei, e cioè gli assegni un valore reale e poi fai assegni a Node p il valore che hai dato a questo elemento; nel secondo caso:

    Codice PHP:
     public void aggiungiValori(){
          
    Node p arrayOfcols[2];
          
    arrayOfcols[2] = new Node(2,3,4);
          if(
    != nullSystem.out.println("p è diverso da null!");
      } 
    tu assegni a p il valore dell'elemento alla terza posizione (ma questo elemento è ancora null per la VM) dopo di che crei effettivamente l'oggetto con il new Node(2,3,4); di conseguenza p è null. Ora è vero che non programmo da troppo tempo in c ma mi sembra strano che in c possa funzionare mentre in Java no semplicemente perchè per il mondo Java è giusto che nel secondo caso p sia null; anzi se avessi usato, nel secondo caso, p.value avresti avuto un NullPointerException proprio perché p è null.
    Spero di averti chiarito le idee e di non averti confuso ancora di più.
    Ciao
    Se vuoi trovare l'arcobaleno, devi sopportare la pioggia

  4. #4
    Utente di HTML.it
    Registrato dal
    Oct 2003
    Messaggi
    1,258
    ti ringraxio per averci dato un occhiata..

    l'inizializzazione che faccio è del tipo cosi:
    Node[] arrayOfcols = new Node[10];
    cioè un array di puntatori a oggetti Node

    ti comemnto questa frase:
    tu assegni a p il valore dell'elemento alla terza posizione (ma questo elemento è ancora null per la VM) dopo di che crei effettivamente l'oggetto con il new Node(2,3,4); di conseguenza p è null.
    io il mio codice lo vedo diversamente:
    io non assegno a p il valore dell'elemento alla terza posizione, ma l'indirizzo del valore alla terza posizione. Cioè p è un puntatore se il valore è null e poi cambia, perchè continua a valere null?

    Per dirlo in altri termini...non posso avere un puntatore a una posizione specifica dell'array?
    cioè che quindi possa accedere a un elemento dell'array in 2 modi..o con array[pos] oppure puntatore.campo se puntatore != da null.
    io in c mi ricordo che lo facevo...posso ricordarmi male, ma provero al piu presto.

  5. #5
    Moderatore di Programmazione L'avatar di LeleFT
    Registrato dal
    Jun 2003
    Messaggi
    17,315
    Premettiamo che in Java non esistono i puntatori. Nel senso che il programmatore non si deve preoccupare di puntatori, in quanto se li gestisce automaticamente la JVM: per il programmatore esistono solo gli oggetti.

    Quando tu hai questa istruzione:
    codice:
    Node [] arrayOFcols = new Node[10];
    allochi in memoria lo spazio per 10 oggetti, tutti ancora nulli.
    Quindi, se usi arrayOFcols in una espressione alla destra di un operazione di assegnamento, mentre è allo stato attuale, riceverai un errore di NullPointerException, in quanto nessun elemento di quell'array è ancora inizializzato.

    Non so cosa intendi con "avere un puntatore alla posizione specifica dell'array"...


    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
    Utente di HTML.it
    Registrato dal
    Oct 2003
    Messaggi
    1,258
    Ciao graxie. Credo di aver risolto cmq il mio dubbio

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.