2009-12-12 3 views
1

J'ai créé une classe dont le nom est Manager et j'ai un Frame dont le nom est BirthList et ce cadre a une table.Je travaille avec MySQL et j'ai entré des données dans le "birthtable" dans MySQL.and je veux ajouter ces données de MySQL dans la table qui est dans mon cadre. CONSEIL: birthList est une liste d'objets Naissance. mais je vais trouver cette exception pourquoi? S'il vous plaît aidez-moi :(Pourquoi j'ai NullPointerException ici?

classe Manager:

public Manager class{ 
    Logger logger = Logger.getLogger(this.getClass().getName()); 
    private static Connection conn = DBManager.getConnection(); 
    private static Admin admin; 

    public static void addToBirthListFromMySQL() throws SQLException { 



    try{ 
     Statement stmt = conn.createStatement(); 



    ResultSet rs= stmt.executeQuery("SELECT * FROM birthtable"); 

     Birth list1; 

     while (rs.next()) { 
      String s1 = rs.getString(2); 
      if (rs.wasNull()) { 
       s1 = null; 
      } 
      String s2 = rs.getString(3); 
      if (rs.wasNull()) { 
       s2 = null; 
      } 
      String s3 = rs.getString(4); 
      if (rs.wasNull()) { 
       s3 = null; 
      } 
      String s4 = rs.getString(5); 
      if (rs.wasNull()) { 
       s4 = null; 
      } 
      String s5 = rs.getString(6); 
      if (rs.wasNull()) { 
       s5 = null; 
      } 
      String s6 = rs.getString(7); 
      if (rs.wasNull()) { 
       s6 = null; 
      } 


      list1 = new Birth(s1, s2, s3, s4, s5, s6); 
      admin.birthList.add(list1); 


     } 




    } 
    catch(SQLException e){ 





    } 

} 

Mon Cadre:

public class BirthList extends javax.swing.JFrame { 

    private Admin admin; 

    /** Creates new form BirthList */ 
    public BirthList(Admin admin) { 
     initComponents(); 
     this.admin = admin; 
     try { 
      Manager.addToBirthListFromMySQL(); 
     } catch (SQLException ex) { 
      Logger.getLogger(BirthList.class.getName()).log(Level.SEVERE, null, ex); 
     } 
     fillTable(); 
    } 


public void fillTable() { 

     String[] columNames = {"name", "family", "father's name", "mother's name", "date of birth", "place of birth"}; 
     List<Birth> birth = admin.getBirthList(); 
     Object[][] data = new Object[birth.size()][columNames.length]; 
     for (int i = 0; i < data.length; i++) { 
      Birth birth1 = birth.get(i); 
      data[i][0] = birth1.getName(); 
      data[i][1] = birth1.getFamily(); 
      data[i][2] = birth1.getFatherName(); 
      data[i][3] = birth1.getMotherName(); 
      data[i][4] = birth1.getDateOfBirth(); 
      data[i][5] = birth1.getPlaceOfBirth(); 


     } 
     DefaultTableModel model = new DefaultTableModel(data, columNames); 
     jTable1.setModel(model); 
    } 

    public boolean isCellEditable(int row, int col) { 
     return true; 
    } 
} 

stacktrace: Exception dans le thread "AWT-EventQueue-0" java.lang.NullPointerException à database.Manager.addToBirthListFromMySQL (Manager.java:272) à AdminGUI.BirthList. (BirthList.java:35) à AdminGUI.BirthFrame.newButton1ActionPerformed (Birth Frame.java:127) à AdminGUI.BirthFrame.access 000 $ (BirthFrame.java:21) à AdminGUI.BirthFrame $ 1.actionPerformed (BirthFrame.java:58) à javax.swing.AbstractButton.fireActionPerformed (AbstractButton.java: 1995) à javax.swing.AbstractButton $ Handler.actionPerformed (AbstractButton.java:2318) à javax.swing.DefaultButtonModel.fireActionPerformed (DefaultButtonModel.java:387) à javax.swing.DefaultButtonModel.setPressed (DefaultButtonModel.java: 242) à javax.swing.plaf.basic.BasicButtonListener.mouseReleased (BasicButtonListener.java:236) à java.awt.Component.processMouseEvent (Component.java:6038) à javax.swing.JComponent.processMouseEvent (JComponent. java: 3265) à java.awt.Component.processEvent (Component.java:5803) à java.awt.Container.processEvent (Container.java:2058) à java.awt.Component.dispatchEventImpl (Component.java:4410) à java .awt.Container.dispatchEventImpl (Container.java:2116) à java.awt.Component.dispatchEvent (Component.java:4240) à java.awt.LightweightDispatcher.retargetMouseEvent (Container.java:4322) à java.awt .LightweightDispatcher.processMouseEvent (Container.java:3986) à java.awt.LightweightDispatcher.dispatchEvent (Container.java:3916) à java.awt.Container.dispatchEventImpl (Container.java:2102) à java.awt.Window .dispatchEventImpl (Window.java:2429) at java.awt.Component.dispatchEvent (Component.java:4240) à java.awt.EventQueue.dispatchEvent (EventQueue.java:599) à java.awt.EventDispatchThread.pumpOneEventForFilters (EventDispatchThread.java:273) à java.awt.EventDispatchThread.pumpEventsForFilter (EventDispatchThread. java: 183) à java.awt.EventDispatchThread.pumpEventsForHierarchy (EventDispatchThread.java:173) à java.awt.EventDispatchThread.pumpEvents (EventDispatchThread.java:168) à java.awt.EventDispatchThread.pumpEvents (EventDispatchThread.java: 160) à java.awt.EventDispatchThread.run (EventDispatchThread.java:121)

ligne 272 est la suivante: admin.birthList.add (list1);

** debugger aussi mon projet et le résultat a été:

debug: écoute sur javadebug programme utilisateur en cours Debugger arrêté sur le code source uncompilable.

* imprimer aussi mon admin objet avec System.out.println (admin) et le résultat a été:

[email protected]*

+1

Cela aiderait si nous connaissions la ligne 'Manager.java: 272'. –

+0

Ash a raison. ps Et aussi il semble que vous n'avez pas besoin de la variable list1. Vous pouvez simplement faire ceci: admin.birthList.add (nouvelle naissance (s1, s2, s3, s4, s5, s6)); –

+0

Dans ce cas, il serait utile si vous pouviez dire quelle est la ligne 272 dans la classe Manager. En aparté, le bloc try/catch dans addToBirthListFromMySQL() va masquer/rejeter toutes les SQLException lancées –

Répondre

3

Au lieu de chasser la cause racine dans l'obscurité, je pense qu'il vaut mieux d'expliquer comment et le pourquoi de NPE sont causées et comment ils peuvent être évités, de sorte que l'OP peut appliquer les connaissances nouvellement acquises pour chasser son/son propre problème trivial.

Regardez, les références d'objets (les variables) peut contenir un fullworthy Object ou simplement rien, qui est null.

SomeObject someObject1 = new SomeObject(); // References something. 
SomeObject someObject2 = null; // References nothing. 

Maintenant, si vous essayez d'accéder rien (null), alors vous obtenir un NullPointerException indubitablement, tout simplement parce que null n'a pas de variables ou méthodes.

someObject1.doSomething(); // Works fine. 
someObject2.doSomething(); // Throws NullPointerException. 

Cette solution est relativement simple. Cela peut se faire essentiellement de deux façons: soit en l'instanciant, soit en l'ignorant.

if (someObject2 == null) { 
    someObject2 = new SomeObject(); 
} 
someObject2.doSomething(); // No NPE anymore! 

ou

if (someObject2 != null) { 
    someObject2.doSomething(); // No NPE anymore! 
} 

En cas de NPE, le premier numéro de la ligne des points de STACKTRACE la ligne exacte où il est causé. Vous avez dit littéralement "ligne 272 est admin.birthList.add(list1);". Cette ligne contient deux endroits où des références d'objet ont été accédées/invoquées (en utilisant l'opérateur point .). Le premier étant admin.birthList et le second étant birthList.add(list1). C'est à vous de découvrir si l'un ou les deux ont causé le NPE. Si c'est la première invocation, alors admin est simplement null. Si c'est la deuxième invocation, alors birthList est simplement null. Vous pouvez le réparer en l'instanciant avec un objet digne de ce nom.

Modifier: Si vous avez du mal à déterminer la cause première (comme cela se produit dans les commentaires), vous devez apprendre le débogage. Exécutez un débogueur ou effectuez simplement le "débogage du pauvre" à l'aide d'un System.out.println() de chaque variable avant d'y accéder/de les invoquer. Regardez d'abord la ligne où le NPE est causé. Si cela est par exemple

admin.birthList.add(list1); 

alors vous devez le changer comme suit pour clouer la cause racine:

System.out.println("admin: " + admin); 
List<Birth> birthList = admin.birthList; 
System.out.println("birthList: " + birthList); 
birthList.add(list1); 

vérifier si l'un d'entre eux imprime null. Sinon, vous pouvez également faire:

if (admin == null) throw new NullPointerException("admin is null!"); 
List<Birth> birthList = admin.birthList; 
if (birthList == null) throw new NullPointerException("birthList is null!"); 
birthList.add(list1); 

vous pouvez aussi séparer les invocations individuelles sur des lignes séparées de sorte que vous avez suffisamment au numéro de ligne pour savoir quelle référence est nulle.

List<Birth> birthList = admin.birthList; // If NPE line points here, then admin is null. 
birthList.add(list1); // If NPE line points here, then birthList is null. 
+0

J'ai fait ce que vous m'avez dit, mais je toujours ai NPE: (((((((((( – Johanna

+0

aussi j'ai trouvé que ma birthList est null pas mon objet admin, aussi j'ai fait if (admin == null && birthList == null) { admin = new Admin(); = new ArrayList birthlist ();} else { admin.birthList.add (list1);} mais je NPE: (((((((( – Johanna

+0

apprendre ensuite le débogage que j'ai édité. ma réponse avec plus d'aide – BalusC

0

Il est difficile de dire parce que les numéros de ligne dans la la trace de la pile ne semble pas correspondre à votre code, mais avez-vous déjà défini "l'administrateur Admin statique privé"; variable dans Manager à une valeur non nulle?

2

À première vue, je dirais que votre instance Admin est nulle, ce qui provoque la NPE dans la méthode addToBirthListFromMySQL()

public BirthList(Admin admin) { 
     initComponents(); // where do you set this.admin to the parameter 'admin' ? 

Vous devez également initialiser la variable admin statique de votre objet statique Manager

public BirthList(Admin admin) { 
     this.admin = admin 
     Manager.admin = admin 
     initComponents(); 

(remarque: vous pouvez ne pas appeler votre paramètre avec le même nom que les variables internes)


debugger aussi mon projet et le résultat a été:

debug: Have no FileObject for C:\Program Files\Java\jdk1.6.0_02\jre\lib\sunrsasign.jar 

Have no FileObject for C:\Program Files\Java\jdk1.6.0_02\jre\classes** 

Assurez-vous que vous n'utilisez pas le compilateur 1.6 et le moteur d'exécution de 1,5 pour exécuter/déboguer votre programme.

Voir this thread:

Voici une liste des possibilités pour les futurs utilisateurs:

  1. au référentiel. (probablement pas)
  2. Redéfinir toutes mes variables d'environnement responsable ...
    a. set path="D:\...\JDK1.5\bin"
    b. set classpath="D:\...\JDK1.5\bin"
    c. set java_home="D:\...\JDK1.5"
  3. Redéfinir toutes mes dépendances sur mon projet. (Project Properties->Libraries).
+0

oui, vous avez raison je l'ai ajouté mais j'ai encore ce NPE :( – Johanna

+0

désolé. Mais je n'ai pas compris ce que vous voulez dire pouvez-vous expliquer plus !!!!! – Johanna

0

Si la ligne 272 de Manager.java est:

admin.birthList.add(list1); 

et si admin n'est pas null qui est ma compréhension de vos mises à jour, la conclusion semble assez évident: birthlist est null et les pauses de code lorsque vous appelez la méthode add() dessus.

Je pense que votre classe Admin ressemble à quelque chose comme ceci:

public class Admin { 
    public List<Birth> birthList; //the visibility seems to be public 
    ... 
} 

et vous n'initialiser l'attribut class birthList. Donc soit l'initialiser en ligne, dans le constructeur, dans une méthode init(), etc, mais le faire quelque part.Par exemple, en ligne:

public class Admin { 
    public List<Birth> birthList = new ArrayList<Birth>(); 
    ... 
} 

En fait, je ne sais pas comment vous instancier et définissez la Admin instance statique de votre classe Manager mais cela est une autre histoire.

Questions connexes