Domanda

RISPOSTA:

Se mai vedi queste righe e sei mistificato come me, ecco cosa significano.

Thread [AWT-EventQueue-0] (Suspended (eccezione NullPointerException))

EventDispatchTread.run () riga: non disponibile [variabili locali non disponibili]

Non è che le variabili non siano disponibili perché si nascondono dietro un sudario di mistero in una biblioteca da qualche parte umida. No no, sono appena usciti dal campo di applicazione! È ancora colpa tua, devi ancora trovare il nulla e no, non puoi incolpare la biblioteca. Lezione importante!

DOMANDA:

Una delle cose più frustranti per me, come principiante sono le biblioteche! È una relazione di amore / odio: da un lato mi lasciano fare cose che normalmente non capirei come fare con il codice che capisco, dall'altro perché non le capisco completamente, a volte lanciano un chiave nel codice che altrimenti funziona bene! È perché non capisco gli errori che possono verificarsi quando si utilizzano queste librerie, perché non le ho scritte e perché eclipse non mi dà molto da fare quando una delle importazioni inizia a funzionare ...

Quindi, ecco il problema: ho lavorato con java.awt.event per gestire un mucchio di JButton sullo schermo per questo e quello. Viene visualizzato un errore quando utilizzo uno dei pulsanti che ho creato. L'errore è:

Thread [AWT-EventQueue-0] (Suspended (eccezione NullPointerException))

EventDispatchTread.run () riga: non disponibile [variabili locali non disponibili]

Cosa significa? Cosa potrebbe causarlo? Sono imbarazzato nel postare il codice, ma se riesci a provare a decifrare il mio stile terribile, ecco il metodo che sembra causare questo errore.

public void actionPerformed(ActionEvent e) {
    String cmd = e.getActionCommand();
    String name;

code...

if(cmd.equals("Play")) {
        name = field.getText();
        card = getCard(name);

        if(card != null) {
            if(rules.zoneHasCard(card, rules.hand)) {
                display.updateStatusMessage(rules.play(card));
                field.setText("");
                display.updateHand(rules.zoneList("hand"));
                display.updateDiscard(rules.zoneList("Discard")); // This is the error here! The discard Zone was empty!
            }
            else {
                field.setText("You do not have " + card.getName());
                field.selectAll();
            }
        }
        else {
            field.setText("That cardname is unused");
            field.selectAll();
        }
    }
}
È stato utile?

Soluzione

Benvenuti nella complessità della scrittura del codice della GUI.

Quando si esegue un programma Swing, viene creato un thread in background chiamato Thread di invio eventi. Quando l'utente fa clic su un JButton, ad esempio, JButton crea e genera un evento utilizzando questo thread di invio eventi. Da qui il nome: è il thread che invia gli eventi!

Il tuo codice:

public void actionPerformed(ActionEvent e) {
        String cmd = e.getActionCommand();
        String name;

// more code...
}

viene chiamato da questo thread di invio eventi, quindi il tuo codice può gestire l'evento.

Da qualche parte nel tuo codice stai provando a fare qualcosa con una variabile che è attualmente uguale a null. Il messaggio di errore ti dice "ehi; mentre eseguivo del codice sul thread di invio degli eventi, ho riscontrato una NullPointerException " nel tuo codice .

Perché non ricevi più informazioni? Forse hai configurato Eclipse per non includere le informazioni di debug durante la compilazione?

Per ora, ti consiglio di aggiungere alcune righe al tuo metodo actionPerformed per mostrare lo stato delle variabili:

System.out.println("field = " + field);
System.out.println("rules = " + rules);
System.out.println("display = " + display);

Vedi se questo mostra dei null.

Anche se NullPointerException proviene da una libreria, la traccia dello stack mostrerà quale riga del codice chiamato quella libreria. Ma solo se hai configurato Eclipse per generare informazioni di debug.

A lungo termine, consulta il Sun's Swing Tutorial per saperne di più su questi problemi.

Altri suggerimenti

Qualsiasi chiamata di metodo su un oggetto null genererà un'eccezione puntatore null.

Nel tuo codice, regole, nome o visualizzazione potrebbero essere nulli e causare un'eccezione.

Usa un debugger (come quello incluso nell'IDE di eclissi) e imposta un punto di interruzione all'inizio del metodo actionPerformed (), quindi spostalo riga per riga per vedere quando una variabile su cui provi a invocare un metodo è null.

Non smettere di leggere la traccia dello stack dopo due righe. Da qualche parte nella traccia dello stack riconoscerai il nome di una delle classi / metodi che hai scritto. Inizia a guardare lì. (tra l'altro, le persone trascorrono molto tempo all'interno dei debugger :-))

Potresti aver dimenticato di impostare effettivamente un ActionCommand.

Nel ActionEvent Documento API c'è una nota riguardante possibili risultati nulli di getActionCommand ().

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top