IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Servlets/JSP Java Discussion :

Je ne trouve pas une NullPointerException


Sujet :

Servlets/JSP Java

  1. #1
    Futur Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Novembre 2017
    Messages
    6
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Novembre 2017
    Messages : 6
    Points : 6
    Points
    6
    Par défaut Je ne trouve pas une NullPointerException
    Bonjour à tous,

    Alors voilà, je débute en J2EE, mais je pense avoir de bonnes bases en Java. Je traque une erreur depuis plusieurs, qui m'échappe complètement ... je suis certain que ce n'est pas "grand" chose, mais je me permets de venir vers vous pour avoir des avis éclairés.

    Voici la stacktrace tout d'abord :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    GRAVE: "Servlet.service()" pour la servlet [com.ebenus.servlets.ProductsServlets] a généré une exception
    java.lang.NullPointerException
    	at com.ebenus.dao.impl.ProductDAO.getProductList(ProductDAO.java:129)
    	at com.ebenus.servlets.ProductsServlets.doGet(ProductsServlets.java:27)
    	at javax.servlet.http.HttpServlet.service(HttpServlet.java:635)
    	at javax.servlet.http.HttpServlet.service(HttpServlet.java:742)
    	at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:231)
    	at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166)
    	at org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:52)
    	at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193)
    	at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166)
    	at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:199)
    	at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:96)
    	at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:478)
    	at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:140)
    	at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:81)
    	at org.apache.catalina.valves.AbstractAccessLogValve.invoke(AbstractAccessLogValve.java:650)
    	at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:87)
    	at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:342)
    	at org.apache.coyote.http11.Http11Processor.service(Http11Processor.java:803)
    	at org.apache.coyote.AbstractProcessorLight.process(AbstractProcessorLight.java:66)
    	at org.apache.coyote.AbstractProtocol$ConnectionHandler.process(AbstractProtocol.java:868)
    	at org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.doRun(NioEndpoint.java:1459)
    	at org.apache.tomcat.util.net.SocketProcessorBase.run(SocketProcessorBase.java:49)
    	at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142)
    	at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617)
    	at org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:61)
    	at java.lang.Thread.run(Thread.java:748)

    La méthode qui semble responsable :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    package com.ebenus.dao.impl;
     
    import java.sql.Connection;
    import java.sql.PreparedStatement;
    import java.sql.ResultSet;
    import java.sql.SQLException;
    import java.sql.Statement;
    import java.util.ArrayList;
    import java.util.List;
     
    import com.ebenus.dao.i.IProduct;
    import com.ebenus.entities.Product;
    import com.ebenus.singleton.Connexion;
     
    public class ProductDAO implements IProduct{
    	private Connection connect = null;
    	 private Statement statement = null;
    	 private PreparedStatement preparedStatement = null;
    	 private ResultSet resultSet = null;
     
           [....]
     
    	public List<Product> getProductList(){
    		List<Product> list = new ArrayList<>();
     
    		try {
    			statement = Connexion.Conn.createStatement();
     
    			 // Result set get the result of the SQL query
                resultSet = statement.executeQuery("SELECT * FROM PRODUIT");
                while(resultSet.next()) {
                	  list.add(new Product(resultSet.getInt("idProduit"), resultSet.getString("reference"),
                			  resultSet.getDouble("prix"), resultSet.getString("nom"), resultSet.getString("description"),
                			  resultSet.getInt("stock"),resultSet.getInt("active"),resultSet.getInt("version")));
                	}
                System.out.println("Liste des produits récupérée");
    		} catch (SQLException e) {
    			e.printStackTrace();
    		}
    		return list;
    	}	
    }
    Et éventuellement le servlet :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    package com.ebenus.servlets;
     
    import java.io.IOException;
    import java.util.List;
     
    import javax.servlet.RequestDispatcher;
    import javax.servlet.ServletException;
    import javax.servlet.annotation.WebServlet;
    import javax.servlet.http.HttpServlet;
    import javax.servlet.http.HttpServletRequest;
    import javax.servlet.http.HttpServletResponse;
     
    import com.ebenus.dao.impl.ProductDAO;
    import com.ebenus.entities.Product;
     
     
    @WebServlet("/ProductsServlets")
    public class ProductsServlets extends HttpServlet {
    	private static final long serialVersionUID = 1L;
     
        public ProductsServlets() {
            super();
        }
     
    	protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
    		ProductDAO pDAO = new ProductDAO();
    		List<Product> products = pDAO.getProductList();
    		request.setAttribute("products", products);
     
    		RequestDispatcher dispatcher = request.getRequestDispatcher("/index.jsp");
    		dispatcher.forward(request, response);
    	}
     
    	protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
    		doGet(request, response);
    	}
    }
    Voilà, n'hésitez pas à me faire d'éventuelles remarques sur mon code, je suis preneur de toute critique constructive.

    Merci dans tous les cas de m'avoir lu.

  2. #2
    Futur Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Novembre 2017
    Messages
    6
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Novembre 2017
    Messages : 6
    Points : 6
    Points
    6
    Par défaut
    La ligne vers laquelle pointe la stacktrace :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    public List<Product> getProductList(){
    		List<Product> list = new ArrayList<>();
    		
    		try {
    			statement = Connexion.Conn.createStatement();
    			
    			 // Result set get the result of the SQL query
                resultSet = statement.executeQuery("SELECT * FROM PRODUIT");
                while(resultSet.next()) {
                	  list.add(new Product(resultSet.getInt("idProduit"), resultSet.getString("reference"),
                			  resultSet.getDouble("prix"), resultSet.getString("nom"), resultSet.getString("description"),
                			  resultSet.getInt("stock"),resultSet.getInt("active"),resultSet.getInt("version")));
                	}
                System.out.println("Liste des produits récupérée");
    		} catch (SQLException e) {
    			e.printStackTrace();
    		}
    
    		return list;
    	}

  3. #3
    Modérateur
    Avatar de joel.drigo
    Homme Profil pro
    Ingénieur R&D - Développeur Java
    Inscrit en
    Septembre 2009
    Messages
    12 430
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 54
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Ingénieur R&D - Développeur Java
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2009
    Messages : 12 430
    Points : 29 131
    Points
    29 131
    Billets dans le blog
    2
    Par défaut
    Salut,

    Une NullPointerException arrive lorsque tu essayes d'utiliser une méthode ou un attribut sur une variable qui n'a pas été initialisée.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    public class Exemple {
     
         private static Integer nombre;
     
         public void static main(String[] args) {
     
              int valeur = nombre.intValue();
     
         }
     
    }
    Le code précédent causera une NullPointerException : en effet, nombre n'a jamais été initialisée avec une instance d'objet, donc vaut null, donc nombre.intValue() cause une NullPointerException, parce que java ne sais pas sur quoi appeller intValue(), nombre vallant null.

    Dans ton cas, c'est manifestement conn qui est null, parce qu'on n'a jamais fait conn= new quelquechose, ou conn = uneMethode() tel que uneMethode() retourne une instance de connexion, avant que ce code qui cause la NullPointerException s'exécute.

    Pour un tel cas, on évitera de toute manière de passer par un attribut, parce qu'une connexion à une base de données c'est peu stable. Tu peux pas créer une constante au lancement de ton programme et être sûr qu'elle existera et qu'elle sera utilisable tout au long de l'exécution du programme, parce qu'un serveur de base de données ça peut tomber, ou le réseau qui te permet d'y accèder peut tomber aussi, et donc il faudra refaire la connexion. En plus, une connexion ne peut faire qu'une seule requête à la fois, tu auras peut être à un moment donné plusieurs requêtes simultanée, et ça va te causer des problèmes. Pour peu que tu veuilles rendre paramétrable ton accès à la base de données, et tu ne pourras pas créer la connexion dès le démarrage (il faudra lire des paramètres avant).

    Au plus simple (tu verras plutard les problématiques de pool de connexion), il te suffit d'utiliser une méthode pour récupérer la connexion plutôt qu'un attribut :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    public class Connexion {
     
       public static Connection getConnection() {
               /** ici tu mets le code qui crée l'instance de connexion avec un return à la fin */
       }
     
    }
    Attention, dans ce cas il faut bien penser à libérer la connexion (méthode close() de Connection) quand la méthode qui a fait le Connexion.getConnection() a fini d'utiliser l'instance, sinon tu vas ouvrir plein de connexions qui ne seront jamais fermée et consommeront des ressources pour rien, jusqu'à ce que ton sgbd ou ton application se plaigne qu'il n'y a plus assez de mémoire...

    Une version un peu plus complexe serait de faire :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    public class Connexion {
     
        private static Connection connection;
       public static Connection getConnection() {
               if ( connection==null ) { // si la connexion n'a jamais été initialisée
                      /** ici tu mets le code qui crée l'instance de connexion et en met la référence dans la variable connection */
               }
              return connection;
       }
     
    }
    Ici tu ne crées qu'une seule instance de Connection, la première fois que ton programme appelle la méthode. Mais :
    1. Il faudra penser à fermer cette connexion proprement lorsque ton programme s'arrête (cela dit, si tu ne le fais pas, il peut y avoir des mécanismes qui pourront quand même faire que les ressources sont libérées).
    2. Tu ne peux pas faire plusieurs requêtes simultanément et ça risque de rapidement arriver avec une application web. Il faudra alors faire un pool.
    L'expression "ça marche pas" ne veut rien dire. Indiquez l'erreur, et/ou les comportements attendus et obtenus, et donnez un Exemple Complet Minimal qui permet de reproduire le problème.
    La plupart des réponses à vos questions sont déjà dans les FAQs ou les Tutoriels, ou peut-être dans une autre discussion : utilisez la recherche interne.
    Des questions sur Java : consultez le Forum Java. Des questions sur l'EDI Eclipse ou la plateforme Eclipse RCP : consultez le Forum Eclipse.
    Une question correctement posée et rédigée et vous aurez plus de chances de réponses adaptées et rapides.
    N'oubliez pas de mettre vos extraits de code entre balises CODE (Voir Mode d'emploi de l'éditeur de messages).
    Nouveau sur le forum ? Consultez Les Règles du Club.

  4. #4
    Futur Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Novembre 2017
    Messages
    6
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Novembre 2017
    Messages : 6
    Points : 6
    Points
    6
    Par défaut
    Ici tu ne crées qu'une seule instance de Connection, la première fois que ton programme appelle la méthode. Mais :
    1. Il faudra penser à fermer cette connexion proprement lorsque ton programme s'arrête (cela dit, si tu ne le fais pas, il peut y avoir des mécanismes qui pourront quand même faire que les ressources sont libérées).
    2. Tu ne peux pas faire plusieurs requêtes simultanément et ça risque de rapidement arriver avec une application web. Il faudra alors faire un pool.
    Super, merci pour ta réponse joel.drigo. En fait le mieux est effectivement de faire via un singleton si je comprends bien ?

    En tout cas ton explication est vraiment claire, merci encore !

  5. #5
    Modérateur
    Avatar de joel.drigo
    Homme Profil pro
    Ingénieur R&D - Développeur Java
    Inscrit en
    Septembre 2009
    Messages
    12 430
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 54
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Ingénieur R&D - Développeur Java
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2009
    Messages : 12 430
    Points : 29 131
    Points
    29 131
    Billets dans le blog
    2
    Par défaut
    Citation Envoyé par ZenStudent Voir le message
    Super, merci pour ta réponse joel.drigo. En fait le mieux est effectivement de faire via un singleton si je comprends bien ?
    C'est une sorte de singleton, mais ça n'en est pas en cas d'accès simultanés (par plusieurs threads) à la méthode.
    L'expression "ça marche pas" ne veut rien dire. Indiquez l'erreur, et/ou les comportements attendus et obtenus, et donnez un Exemple Complet Minimal qui permet de reproduire le problème.
    La plupart des réponses à vos questions sont déjà dans les FAQs ou les Tutoriels, ou peut-être dans une autre discussion : utilisez la recherche interne.
    Des questions sur Java : consultez le Forum Java. Des questions sur l'EDI Eclipse ou la plateforme Eclipse RCP : consultez le Forum Eclipse.
    Une question correctement posée et rédigée et vous aurez plus de chances de réponses adaptées et rapides.
    N'oubliez pas de mettre vos extraits de code entre balises CODE (Voir Mode d'emploi de l'éditeur de messages).
    Nouveau sur le forum ? Consultez Les Règles du Club.

  6. #6
    Futur Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Novembre 2017
    Messages
    6
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Novembre 2017
    Messages : 6
    Points : 6
    Points
    6
    Par défaut
    Citation Envoyé par joel.drigo Voir le message
    C'est une sorte de singleton, mais ça n'en est pas en cas d'accès simultanés (par plusieurs threads) à la méthode.
    C'est noté, merci encore.

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. JTapi : XTapi - ne trouve pas une classe?
    Par rXpCH dans le forum API standards et tierces
    Réponses: 2
    Dernier message: 05/04/2017, 11h30
  2. Réponses: 3
    Dernier message: 21/04/2010, 10h36
  3. Réponses: 1
    Dernier message: 14/04/2010, 20h38
  4. il ne trouve pas une requête que j'ai créée
    Par Gabrieel dans le forum VBA Access
    Réponses: 7
    Dernier message: 07/11/2008, 17h08
  5. Réponses: 3
    Dernier message: 19/05/2008, 13h51

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo