2010-06-19 6 views
-1

Après avoir compilé mon application dans Netbeans et exécuté l'application dans Netbeans, cela fonctionne très bien.NullPointerException

Toutes les images se chargent bien. Si vous essayez de double-cliquer, l'exécution de l'application n'aboutit à rien.

course Essayer de la ligne de commande donne cette erreur:

Exception in thread "main" java.lang.NullPointerException 
    at Entity.<init>(Entity.java:24) 
    at Actor.<init>(Actor.java:5) 
    at TileEngine.drawMap(TileEngine.java:52) 
    at GraphicsCanvas.<init>(GraphicsCanvas.java:32) 
    at Main.<init>(Main.java:22) 
    at Main.main(Main.java:18) 

en dehors de Netbeans Compiler laisse aucune erreur et de l'exécution est très bien. Après l'essai et l'erreur de commenter je suis venu à ceux-ci l'appel anonyme à l'acteur qui cause le problème. Voici la fonction du code qui, lorsqu'il est mis en commentaire, ne lance pas l'exception. Je ne peux pas sembler trouver quelque chose de mal avec cela.

public class Actor extends Entity 
{ 
    Actor(String filename, int x, int y) 
    { 
     super(filename, x, y); 
    } 
} 


void drawMap(String imgWalkable, String imgNotWalkable, GraphicsCanvas gp) 
    { 
     // Since each 1 tile is a tile that can be walked on 
     // we need to set the 1 tile to something you can walk on. 
     // The tiles that cannot be walked on are the ones that are 0 

     for (int x = 0; x < WID; x++) 
     { 
      for (int y = 0; y < HEI; y++) 
      { 
       if (GRID[x][y] == 1) 
        gp.add(new Actor(imgWalkable, x * TILE_WID, y * TILE_HEI)); 
       //else 
        //gp.add(new Actor(imgNotWalkable, x * TILE_WID, y * TILE_HEI)); 
      } 
     } 
    } 

J'ai encore tracé cette erreur à BufferedImage dans ma classe Entity.

public class Entity extends JLabel 
{ 
    Entity(String filename, int x, int y) 
    { 
     this.x = x; 
     this.y = y; 
     this.setLocation(this.x, this.y); 
     bImg = loadImage(filename); 
     this.setSize(bImg.getWidth(), bImg.getHeight()); 
     ImageIcon icon = new ImageIcon(bImg); 
     setIcon(icon); 
    } 

    public BufferedImage loadImage(String filename) { 
     BufferedImage tmp = null; 
     try { 
      tmp = ImageIO.read(getClass().getResource(filename)); 
     } catch (Exception e) { } 
     return tmp; 
    } 
} 

Après avoir retiré la fonction loadImage et au lieu de charger l'image comme ceci:

Entity(String filename, int x, int y) 
    { 
     try { 
     bImg = ImageIO.read(getClass().getResource(filename)); //LINE 25 
     } catch (IOException ex) { 
      Logger.getLogger(Entity.class.getName()).log(Level.SEVERE, null, ex); 
     } 

     this.x = x; 
     this.y = y; 
     this.setLocation(this.x, this.y); 
     //bImg = loadImage(filename); 
     //loadImage(bImg, filename); 
     this.setSize(bImg.getWidth(), bImg.getHeight()); 
     Icon icon = new ImageIcon(bImg); 
     setIcon(icon); 
     setVisible(isAlive); 
    } 

Cette nouvelle erreur est reçu:

Exception in thread "AWT-EventQueue-0" java.lang.NullPointerException: input == null! 
    at javax.imageio.ImageIO.read(ImageIO.java:1362) 
    at Entity.<init>(Entity.java:25) 
+0

@trashgod: Ce problème a été résolu. –

+0

Le problème réside dans ma classe TileEngine –

+0

Les NPE sont faciles à trouver et à corriger. L'exception vous indique exactement la ligne dans laquelle le NPE s'est produit. Utilisez votre approche de débogage préférée (et votre «pensée critique») à partir de là. Je recommanderais d'apprendre à utiliser un débogueur qui vous permet d'inspecter l'état et de "passer" par le code. –

Répondre

4
Entity.<init>(Entity.java:24) 

Cela vous dit que l'exception est jeté à la ligne 24 de "Entity.java". VOUS NE NOUS DIRE QUI EST EN LIGNE QUE (tsk, tsk, tsk !!) ... mais je pense qu'il est celui-ci:

this.setSize(bImg.getWidth(), bImg.getHeight()); 

et que cela se produit parce que loadImage est de retour null.

Un autre problème (bien que n'étant pas la cause du NPE) est que la ligne suivante utilise this.x et this.y avant qu'ils aient été initialisés. En fait, le constructeur ne les initialise pas du tout !!

Encore un autre problème est que votre méthode loadImage est explicitement codée pour attraper et ignorer les exceptions, et retourner null. Donc, fondamentalement, si l'image lue échoue pour une raison quelconque, vous ne le saurez jamais. Cela jette doute considérable sur votre affirmation que l'image est en cours de chargement avec succès. Et même si ce n'est pas la cause de votre problème, écraser des exceptions comme ça est extrêmement mauvaise pratique.

this.setLocation(this.x, this.y); 

EDIT

Le problème est maintenant dans cette ligne:

bImg = ImageIO.read(getClass().getResource(filename)); //LINE 25 

et le problème est que getClass().getResource(filename) est de retour null et passer à ImageIO.read qui jette le NPE comme résultat.Le javadoc pour Class.getResource(String) indique que la méthode renvoie null si la ressource est introuvable.

QUE est votre problème. Si vous ne croyez pas ce diagnostic, ajoutez quelques traces pour voir ce que getClass().getResource(filename) retourne effectivement.

+0

cela n'a pas de sens parce que l'image est chargée –

+0

@mOOst - bien 1) vous ne nous avez pas dit ce que la ligne 25 est et 2) est ce que les éléments de preuve que vous nous avez donné semble pointer vers. –

+0

J'ai oublié d'inclure le code pour init'n x/y. Le problème n'est pas la fonction loadImage. Le problème réside dans ImageIcon lui-même. Je vais mettre à jour le post. –

1

est le nom étant passé à LoadImage un chemin relatif? Si c'est le cas, il pourrait charger l'image depuis l'intérieur de l'EDI mais pas de l'extérieur. Cela permettrait au fichier de se charger correctement dans l'EDI mais pourrait entraîner une exception de pointeur nul d'autres environnements. Si tel est le cas, l'utilisation d'un chemin absolu peut résoudre le problème.

+0

Toutes les images se chargent bien –

+0

Avez-vous vérifié cela dans tous les environnements? Les images qui se chargent dans l'EDI ne signifient pas qu'elles le font à l'extérieur. getResource (filename) pourrait vous laisser fonctionner avec certains environnements mais pas avec d'autres. Par exemple, peut-être que NetBeans fait du répertoire de travail un point spécifique dans votre projet. Un appel de ligne de commande ne ferait pas cela. Le code que vous avez publié n'inclut pas les contrôles supplémentaires que vous pourriez avoir. Avez-vous essayé de vérifier si tmp est nul immédiatement après l'avoir assigné. –

+0

J'utilise le chargement de chemin relatif. Oui j'ai vérifié tmp et il reste nul; mais comme je l'ai dit, les images sont chargées, ce qui n'a pas de sens. –

0

Si vous utilisez getResource(), comme vous faites dans la ligne où l'erreur se produit maintenant:

bImg = ImageIO.read(getClass().getResource(filename)); 

alors Java recherchera le fichier à charger sur le chemin de classe. Que contient filename? Est-il au bon endroit afin qu'il puisse être trouvé par rapport au classpath?

En outre, la capture et sans tenir compte des exceptions, comme vous faites dans votre méthode Entity.loadImage():

try { 
    tmp = ImageIO.read(getClass().getResource(filename)); 
} catch (Exception e) { } 

est l'un des pires péchés que vous pouvez commettre en tant que développeur Java. Ne fais pas ça; au moins consigner l'exception, la gérer d'une autre manière, ou déclarer que la méthode à laquelle elle arrive l'envoie. Par exemple:

// Declare that the method might throw IOException 
public BufferedImage loadImage(String filename) throws IOException { 
    // ... 

    // No need to try/catch the exception now 
    tmp = ImageIO.read(getClass().getResource(filename)); 
}