Excepción en el hilo "principal" java.lang.NullPointerException (15-Puzzle)

En primer lugar, esta pregunta es sobre 15-Puzzle. Y estoy tratando de aprender a codificarlo en lenguaje Java.

Tengo que estudiar Inteligencia Artificial en mi universidad sobre el algoritmo IDA* y encontré este enlace de Brian Borowski: http://brian-borowski.com/Software/Puzzle/ ese fue un enlace bastante bueno, pero tengo un error cuando intento construirlo manualmente en mi Eclipse.

Alguien puede ayudarme? Tengo un error que dice:

Exception in thread "main" java.lang.NullPointerException
    at Puzzle.setNumOfTiles(Puzzle.java:45)
    at Puzzle.<init>(Puzzle.java:25)
    at GUI.<init>(GUI.java:196)
    at Application.<init>(Application.java:19)
    at Application.main(Application.java:27)

Ya intenté rastrear el error, buscando en Google, pero aún no puedo encontrar la solución. Dijo que NullPointerException ocurre cuando alguna variable tiene un valor nulo. ¿Alguien puede ayudarme aquí?

Aquí está el código fuente

Aplicación.java

public class Application {

    /**
     * Default constructor.
     * Creates an instance of the gui.
     */
    public Application() {
        ApplicationStarter appStarter = null;
        new GUI(appStarter); // Line 19
    }

    /**
     * Main method.
     * Creates an instance of the application.
     */
    public static void main(final String[] args) {
        new Application(); // Line 27
    }
}

Rompecabezas.java

public Puzzle(final int numOfTiles) {
    super();
    setNumOfTiles(numOfTiles); // Line 25
    setSize(panelWidth, panelHeight);
    setDoubleBuffered(true);
}

public void setNumOfTiles(final int numOfTiles) {
    this.numOfTiles = numOfTiles;
    dimension = (int)Math.sqrt(numOfTiles);
    imageArray = new Image[numOfTiles];
    final String file = "images/" + (numOfTiles - 1) + "-puzzle/shrksign_";
    imageArray[0] = null;
    for (int i = 1; i < numOfTiles; ++i) {
        final StringBuilder builder = new StringBuilder(file);
        if (i <= 9) {
            builder.append("0");
        }
        builder.append(Integer.toString(i));
        builder.append(".gif");
        imageArray[i] = ImagePanel.getImage(builder.toString());
    }
    imageWidth  = imageArray[1].getWidth(null); // Line 45
    imageHeight = imageArray[1].getHeight(null);
    panelWidth  = imageWidth * dimension;
    panelHeight = imageHeight * dimension;
    state = new byte[numOfTiles];
    sleepMs = 500 / imageWidth;
    animationDone = true;
    resetOrder();
}

GUI.java

...

this.puzzle = new Puzzle(PuzzleConfiguration.getNumOfTiles());

...

preguntado el 03 de mayo de 12 a las 09:05

¿Cuál es la línea 45 en Puzzle.java? ¿Qué es nulo y no debería estar en esta línea? ¿Qué sucede cuando ejecuta su código con un depurador? -

¿Depuraste lo que sucede en la línea 45? ¿Qué es nulo allí y por qué? Podría ImagePanel.getImage(...) no encuentra la imagen y devuelve nulo en ese caso? ... -

Cual es el valor de PuzzleConfiguration.getNumOfTiles()? ¿Comprobaste que tus gifs existen y tienen el nombre correcto? -

@Thomas, estúpido, después de leer tu comentario, olvidé copiar la imagen en mi espacio de trabajo y ahora funciona. ¡Muchas gracias chicos! -

3 Respuestas

Tiene toda la razón sobre el significado de la excepción:

Dijo que NullPointerException ocurre cuando alguna variable tiene un valor nulo.

Lo que tienes que hacer es mirar el setNumOfTiles method, específicamente la línea 45 (del archivo fuente completo, no del método) y vea qué sucede allí.

Lo más probable es que esté utilizando una variable no inicializada OR pasando uno como argumento.

Buena suerte.

contestado el 03 de mayo de 12 a las 10:05

ha inicializado la matriz con valores nulos

imageArray = new Image[numOfTiles];

Luego configurando sus valores a través del bucle for

imageArray[i] = ImagePanel.getImage(builder.toString());

pero los valores que se establecen son nulos y cuando intenta llamar al método desde el valor nulo, obtiene NULLPOINTEREXCEPTION en esta línea

 imageWidth  = imageArray[1].getWidth(null);

imageArray[1] contiene valores nulos. llamando en null siempre caz NULLPOINTEREXCEPTION

contestado el 03 de mayo de 12 a las 10:05

Obviamente, imageArray[1] tiene un valor nulo. Puede ser que ImagePanel.getImage() regrese null para el elemento 1, o ese numOfTiles >= 1 para que el bucle no se ejecute.

Su ciclo comienza en i y se preincrementa, lo que significa que no se ejecuta ningún ciclo con i = 1 (la primera iteración se ejecuta con i = 2). yo usaria este formulario

for (int i = 1; i <= numOfTiles; i++) {

EDIT:

Tomás tiene razón; de esa manera, numOfTiles es demasiado bajo (1 o menos) o ImagePanel.getImage devuelve nulo (¿falta un archivo de recursos?)

contestado el 03 de mayo de 12 a las 10:05

En realidad, eso no es cierto. Ahí is una iteración con i = 1. El preincremento no cambia la lógica aquí ya que se invoca la operación de incremento después de una iteración (así que en la primera iteración i seguirá teniendo el valor 1). - Thomas

No es la respuesta que estás buscando? Examinar otras preguntas etiquetadas or haz tu propia pregunta.