Pregunta

RESPUESTA:

Si alguna vez ves estas líneas y estás mistificado como yo, esto es lo que significan.

Thread [AWT-EventQueue-0] (Suspendido (excepción NullPointerException))

EventDispatchTread.run () línea: no disponible [variables locales no disponibles]

No es que las variables no estén disponibles porque están al acecho detrás de un manto de misterio en una biblioteca en algún lugar húmedo. No, no, ¡simplemente se salieron del alcance! Todavía es tu culpa, todavía tienes que encontrar el nulo, y no, no puedes culpar a la biblioteca. Lección importante!

PREGUNTA:

¡Una de las cosas más frustrantes para mí, como principiante, son las bibliotecas! Es una relación de amor / odio: por un lado, me dejaron hacer cosas que normalmente no entendería cómo hacer con el código que sí entiendo, por otro lado porque no los entiendo completamente, a veces arrojan un ¡Llave en el código que de lo contrario funciona bien! Es porque no entiendo los errores que pueden ocurrir al usar estas bibliotecas, porque no los escribí y porque eclipse no me da mucho para ir cuando una de las importaciones comienza a actuar ...

Entonces, aquí está el problema: he estado trabajando con java.awt.event para manejar un montón de JButtons en la pantalla para esto y aquello. Recibo un error cuando uso uno de los botones que he creado. El error es:

Thread [AWT-EventQueue-0] (Suspendido (excepción NullPointerException))

EventDispatchTread.run () línea: no disponible [variables locales no disponibles]

¿Qué significa esto? ¿Qué podría estar causándolo? Me da vergüenza publicar el código, pero si puede intentar descifrar mi terrible estilo, este es el método que parece provocar este error.

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();
        }
    }
}
¿Fue útil?

Solución

Bienvenido a la complejidad de escribir código GUI.

Cuando ejecuta un programa Swing, se crea un subproceso de fondo llamado Subproceso de envío de eventos. Cuando el usuario hace clic en un JButton, por ejemplo, JButton crea y dispara un evento usando este hilo de envío de eventos. De ahí el nombre: ¡es el hilo que distribuye eventos!

Su código:

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

// more code...
}
Este subproceso de envío de eventos llama a

, por lo que su código puede manejar el evento.

En algún lugar dentro de su código, está tratando de hacer algo con una variable que actualmente es igual a nula. El mensaje de error le dice: "oye, mientras ejecutaba un código en el subproceso de envío de eventos, encontré una excepción NullPointerException". en su código .

¿Por qué no recibes más información? ¿Posiblemente configuró Eclipse para no incluir información de depuración al compilar?

Por ahora, recomiendo agregar algunas líneas a su método actionPerformed para mostrar el estado de las variables:

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

Vea si esto muestra nulos.

Incluso si la NullPointerException proviene de una biblioteca, el seguimiento de la pila mostrará qué línea de su código llamó a esa biblioteca. Pero solo si ha configurado Eclipse para generar información de depuración.

A largo plazo, trabaje a través del Tutorial Swing de Sun para obtener más información sobre estos problemas.

Otros consejos

Cualquier llamada a un método en un objeto nulo generará una excepción de puntero nulo.

En su código, reglas, nombre o visualización podrían ser nulos y causar una excepción.

Use un depurador (como el que se incluye en el eclipse IDE) y establezca un punto de interrupción al comienzo del método actionPerformed (), luego recorra línea por línea para ver cuándo una variable en la que intenta invocar un método es nulo.

Simplemente no dejes de leer el seguimiento de la pila después de dos líneas. En algún lugar de la traza de la pila reconocerás el nombre de una de las clases / métodos que escribiste. Comienza a buscar allí. (por cierto, las personas pasan mucho tiempo dentro de los depuradores :-))

Es posible que haya olvidado configurar realmente un ActionCommand.

En el ActionEvent API Doc hay una nota sobre los posibles resultados nulos de getActionCommand ().

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top