2017-09-11 1 views
1

Je sais que beaucoup de sujets similaires existent à propos de cette erreur mais j'ai essayé quelques suggestions et mon problème n'est toujours pas enregistré. Je suis ce tutoriel: https://www.youtube.com/watch?v=B3gEbC37DAM&list=PL1A506B159E5BD13E&index=2Accès au pointeur null potentiel. La variable peut être nulle à cet endroit. java.lang.NullPointerException

Voici mon code:

public class JdbcDaoImpl {  
    public Circle getCircle(final int circleId) { 
    Connection conn = null; 

    try { 
     String driver = "org.apache.derby.jdbc.ClientDriver"; 
     Class.forName(driver).newInstance(); 
     conn = DriverManager.getConnection("jdbc:derby//localhost:1527//db"); 
     PreparedStatement ps = conn.prepareStatement("SELECT * FROM circle where id= ?"); 
     ps.setInt(1, circleId); 

     Circle circle = null; 
     ResultSet rs = ps.executeQuery(); 
     if (rs.next()) { 
      circle = new Circle(circleId, rs.getString("name")); 
     } 
     rs.close(); 
     ps.close(); 
     return circle; 
    } catch (Exception e) { 
     throw new RuntimeException(e); 

    } finally { 
     try { 
      conn.close(); 

     } catch (SQLException e) { 
     } 

    } 
    } 
} 

On "conn.close();" il dit: Accès potentiel au pointeur nul. La variable peut être nulle à cet endroit. Et je cette erreur quand je lance le programme: Exception dans le thread « principal » java.lang.NullPointerException

J'ai essayé des solutions que j'ai vu sur des sujets similaires comme celui-ci:

if(conn!=null){ 
    conn.close(); 
} 

mais je dois encore les erreurs.

Merci d'avance pour votre aide!

+2

Quelles sont les autres erreurs? –

+0

quelles erreurs obtenez-vous lorsque vous mettez l'instruction 'if'? – alirabiee

+1

Les questions demandant une aide au débogage ("pourquoi ce code ne fonctionne-t-il pas?") Doivent inclure le comportement souhaité, un problème ou une erreur spécifique et le code le plus court nécessaire pour le reproduire dans la question elle-même. Les questions sans énoncé de problème clair ne sont pas utiles aux autres lecteurs. Voir: Comment créer un [mcve]. Utilisez le lien "modifier" pour améliorer votre * question * - ne pas ajouter plus d'informations via des commentaires. Merci! – GhostCat

Répondre

-1

La raison pour laquelle conn peut être nul est simple. Si le code exécuté avant conn est asigned, soit avant ce code fonctionne avec succès:

String driver = "org.apache.derby.jdbc.ClientDriver"; 
Class.forName(driver).newInstance(); 
conn = DriverManager.getConnection("jdbc:derby//localhost:1527//db"); 

ce code doit fonctionner avec succès pour conn ne pas être nulle, par conséquent, vous avez besoin d'un chèque non nul avant d'appeler close() là-dessus.

0

Vous n'avez pas besoin de charger explicitement le pilote (Class.forName), en supposant que vous utilisez Java> = 1.6.

Vous pouvez utiliser essayer avec-ressources pour gérer les objets AutoCloseable (Connection, PreparedStatement et ResultSet), de sorte que votre code peut être écrit:

public Circle getCircle(final int circleId) { 
    try (Connection conn = DriverManager.getConnection("jdbc:derby//localhost:1527//db"); 
     PreparedStatement ps = conn.prepareStatement("SELECT * FROM circle where id= ?")){ 
     ps.setInt(1, circleId); 

     Circle circle = null; 
     try (ResultSet rs = ps.executeQuery()) { 
     if (rs.next()) { 
      circle = new Circle(circleId, rs.getString("name")); 
     } 
     } 
     return circle; 
    } catch (Exception e) { 
     throw new RuntimeException(e); 
    } 
    } 

Cela garantit également toutes les ressources sont fermées correctement, ce qui résout beaucoup de problèmes qui peuvent survenir en raison de fuites de ressources. Le problème était que getConnection pouvait lancer une exception, laissant conn comme null, ce qui provoquerait un pointeur nul lorsque vous tenteriez de le fermer dans le bloc finally.

0

finally est toujours exécuté pendant que vous utilisez prises try, où vous pouvez obtenir un NullPointerException potentiel est quand conn = DriverManager.getConnection("jdbc:derby//localhost:1527//db"); lancers francs NullPointerException qui est pris par votre catch (Exception e) et puis finalement le bloc commence à exécuter où vous faites conn.close(), mais votre objet conn est NULL qui relance NullPointerException qui n'est pas attrapé, car vous attrapez catch (SQLException e)