2009-06-21 7 views
1

J'ai une méthode ... où je ne peux pas trouver l'erreur:Pourquoi est-ce que j'obtiens une exception de pointeur nul à partir de ce code Java?

public String getUsernameforID(int id) { 
    String statment = "SELECT USERNAME FROM `BENUTZER` WHERE `ID` = ? ;"; 
    String username = null; 
    try { 
     PreparedStatement ps = dbCommunicator.getStatment(statment); // HERE : NULL POINTER EXECTION 
     ps.setInt(1, id); 
     ResultSet rs = dbCommunicator.readFromDB(ps); 

     if (rs.first()) { 
      username = rs.getString("USERNAME"); 
     } 
    } catch (SQLException ex) { 
     Logger.getLogger(DBManager.class.getName()).log(Level.SEVERE, null, ex); 
    } 
    return username; 

Je pense que c'est la déclaration ... mais comment puis-je trouver cela? Je reçois une Exception de pointeur nul.

Edit: mon getStatment méthode:

public PreparedStatement getStatment(String st) { 
    connect(); 
    PreparedStatement ps = null; 
    try { 
     ps = (PreparedStatement) connection.prepareStatement(st); 
    } catch (SQLException ex) { 
     Logger.getLogger(DBCommunicator.class.getName()).log(Level.SEVERE, null, ex); 
    } 
    return ps; 
    } 

L'exception:

Exception in thread "main" java.lang.NullPointerException 
    at test.DBCommunicator.getStatment(DBCommunicator.java:107) 
    at test.database.DBManager.getUsernameforID(DBManager.java:359) 
    at dbtestdrive.Main.main(Main.java:25) 
+0

quel DB utilisez-vous? – Macarse

+0

J'utilise mySQL – darkrain

+0

NullPointerException .. où? – dfa

Répondre

5

Bien que cette question ait pu être résolue, voici un petit peu comment procéder pour le débogage étant donné une trace de pile.

Dans ce cas, la trace de la pile est la suivante:

Exception in thread "main" java.lang.NullPointerException 
    at test.DBCommunicator.getStatment(DBCommunicator.java:107) 
    at test.database.DBManager.getUsernameforID(DBManager.java:359) 
    at dbtestdrive.Main.main(Main.java:25) 

Cela montre que, dans la méthode test.DBCommunicator.getStatment, un NullPointerException a été jeté à l'emplacement de la ligne 107 de DBCommunicator.java.

En outre, la méthode getStatment a été appelée à partir de la ligne 358 de DBManager.java qui se trouve dans la méthode DBManager.getUsernameforID.

Par conséquent, la première chose à vérifier est ce qui se passe à la ligne 107 de DBCommunicator.java.

Bien qu'il n'y ait pas de numéro de ligne dans le code extrait donné, on peut supposer qu'un NullPointerException a eu lieu dans la ligne suivante:

ps = (PreparedStatement) connection.prepareStatement(st); 

Il y a une chose qui est assez courante au sujet NullPointerException s - ils se présentent en général lorsque les appels de méthode sont effectués sur une référence null. Invoquer une méthode sur un objet qui n'existe pas va lancer un NullPointerException.

Dans le code ci-dessus, on peut attendre à ce que la variable connection est en fait null, plutôt que d'avoir un Connection. Cela devrait conduire à essayer de déterminer pourquoi la variable connection est null plutôt que d'avoir une connexion valide à la base de données initialisée.

1

Il est probablement parce que votre requête échoue, essayez de la modifier à:

String statment = "SELECT USERNAME FROM `BENUTZER` WHERE `ID` = ?"; 

Votre requête d'origine comportait un point-virgule, ce qui est illégal. Cela pourrait avoir provoqué une nullpointerexception à un stade ultérieur, je vous conseille de publier le contenu de votre exception.

EDIT:

dbCommunicator.getStatment(statment); 

devrait être:

dbCommunicator.getStatement(statment); 

Vous êtes mal orthographié 'déclaration' comme 'statment', ce qui est très bien pour un nom de variable, mais pas en se référant à une méthode :)

+0

non .. ce n'était pas le problème :( – darkrain

+0

Alors collez votre exception, ou au moins le numéro de ligne qui le lance – karim79

+0

Voir mon edit s'il vous plaît – karim79

0
//Ending ";" inside the string, is not neccessary. 
String statment = "SELECT USERNAME FROM `BENUTZER` WHERE `ID` = ? ;"; 

Au lieu de:

PreparedStatement ps = dbCommunicator.getStatment(statment); 

PreparedStatement ps = dbCommunicator.prepareStatement(statment); 

C'est ce que j'ai utilisé oracle.

Questions connexes