Pagina 1 di 2 1 2 ultimoultimo
Visualizzazione dei risultati da 1 a 10 su 11
  1. #1
    Utente di HTML.it
    Registrato dal
    May 2002
    Messaggi
    43

    [Java] NullPointerException

    Salve a tutti.
    Ho tre file, uno chiamato Main.java, uno GPanel.java e uno Grafo.java.
    Il Main crea un oggetto Grafo e un oggetto GPanel, passandogli il Grafo come argomento. Compito della classe GPanel è disegnare il grafo.

    Nella classe GPanel ho ridefinito il metodo paintComponent, che ha l'esclusivo compito di passare il proprio contesto grafico (g) al grafo, tramite il metodo draw(Graphics g) di quest ultimo.

    Quest'ultimo pensa poi a disegnare vertici e archi, secondo la sua composizione interna.

    Il problema è che il programma genera una NullPointerException nel file GPanel.java, proprio quando chiama grafo.draw(g).

    Ho pensato che il problema possa essere nel costruttore di GPanel, fatto così:

    codice:
        public GPanel(Grafo g) {
            grafo = g;
        }
    dove grafo è dichiarato come private Grafo grafo;
    Ho come l'impressione che "grafo = g" non esegua né una copia esatta del grafo, né gli assegni lo stesso indirizzo di memoria. Sbaglio?

    Come posso risolvere? Non mi va di dichiarare il grafo nel Main di tipo pubblico, mi sa tanto di cattiva programmazione. Anche perché non posso renderlo final dato che dentro Main deve essere modificato.

    Consigli?

  2. #2
    effettivamente dichiararlo public non è bello, al massimo dichiaralo static così puoi utilizzare sempre lo stesso

    ma la dichiarazione di grafo è proprio quella che hai scritto?
    "private Grafo grafo;"

    senza inizializzazione? tipo
    "private Grafo grafo = new Grafo ();"

    prova magari con un bel
    "this.grafo = g;"
    che all'interno di un costruttore è sempre meglio anche se non so se cambi qualcosa!
    www.matteosteri.it

  3. #3
    effettivamente dichiararlo public non è bello, al massimo dichiaralo static così puoi utilizzare sempre lo stesso

    ma la dichiarazione di grafo è proprio quella che hai scritto?
    "private Grafo grafo;"

    senza inizializzazione? tipo
    "private Grafo grafo = new Grafo ();"

    prova magari con un bel
    "this.grafo = g;"
    che all'interno di un costruttore è sempre meglio anche se non so se cambi qualcosa!

    tommisceddu
    www.matteosteri.it

  4. #4
    Utente di HTML.it
    Registrato dal
    Feb 2002
    Messaggi
    1,798
    Probabilmente l'oggetto Graphics non esiste ancora.
    Se l'errore te lo da durante la compilazione, significa che non l'hai inizializzato, altrimenti in run-time, molto probabilmente l'oggetto cui richiedi il Graphics non è ancora stato creato.

    Ciao.
    Slack? Smack!

  5. #5
    Utente di HTML.it
    Registrato dal
    May 2002
    Messaggi
    43
    Originariamente inviato da tommisceddu
    ma la dichiarazione di grafo è proprio quella che hai scritto?
    "private Grafo grafo;"

    senza inizializzazione? tipo
    "private Grafo grafo = new Grafo ();"

    prova magari con un bel
    "this.grafo = g;"
    che all'interno di un costruttore è sempre meglio anche se non so se cambi qualcosa!

    sì, ho dichiarato grafo come "private Grafo grafo;", senza inizializzarlo.
    Non ho messo il new Grafo() perché penso non serva, visto che nel costruttore ho fatto come hai detto tu, grafo = g (il this è inutile, no?).
    Quello che non capisco è il significato di "grafo = g;".
    Cosa fa esattemente?
    Assegna lo stesso indirizzo di memoria di g a grafo?
    Crea una copia di g e la assegna a grafo?


    Quando scrivo
    codice:
        public GPanel(Grafo g) {
            grafo = g;
        }
    g viene passato come una copia dell'oggetto di Main o è lo stesso oggetto?

  6. #6
    Utente di HTML.it
    Registrato dal
    May 2002
    Messaggi
    43
    Originariamente inviato da Sergio Pedone
    Probabilmente l'oggetto Graphics non esiste ancora.
    Se l'errore te lo da durante la compilazione, significa che non l'hai inizializzato, altrimenti in run-time, molto probabilmente l'oggetto cui richiedi il Graphics non è ancora stato creato.

    L'errore lo da a tempo di esecuzione. Purtroppo non riesco a capire perché l'oggetto non viene creato...

  7. #7
    essendo degli oggetti e non dei tipi di dato predefiniti (int, char, float ... )
    il significato dell'assegnamento ( = ) non è altro che la copia dell'indirizzo della cella di memoria a cui fa riferimento l'oggetto di conseguenza i due oggetti diventano alias ovvero puntano allo stesso oggetto.
    www.matteosteri.it

  8. #8
    Utente di HTML.it
    Registrato dal
    Feb 2002
    Messaggi
    1,798
    Originariamente inviato da pa0l0
    L'errore lo da a tempo di esecuzione. Purtroppo non riesco a capire perché l'oggetto non viene creato...
    Puoi riportare altro codice per capire dove sta l'inghippo?
    Slack? Smack!

  9. #9
    Utente di HTML.it
    Registrato dal
    May 2002
    Messaggi
    43
    D'oh!
    Ma quanto sono stupido

    avevo messo una linea di commento fatta così
    codice:
    	// **************************************
    per segnalarmi che dovevo ancora lavorare su quella parte, e mi sono accorto soltanto ora che java interpretava quel // * come un /* e quindi iniziava un commento su più righe fino alla fine del metodo main!!

    Giorni interi a scervellarmi!

    Ora funziona tutto, grazie ancora!

  10. #10
    Utente di HTML.it
    Registrato dal
    Feb 2002
    Messaggi
    1,798
    Non è per sfiducia, ma il doppio slash, viene interpretato come commento fino a fine riga, indipendentemente da cosa segue. Inoltre avresti avuto una segnalazione durante la compilazione del sorgente in quanto l'indicatore di fine commento "*/" non era presente.

    Slack? Smack!

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