NullPointerException valide???

Résolu
Byron - Modifié par jordane45 le 5/07/2016 à 20:03
 Byron - 6 juil. 2016 à 16:51
Bonjour,

Soit je suis à côté de mes pompes, ou alors ce n'est pas évident pour moi.
Quoi qu'il en soit pourriez-vous m'indiquer pour quelle raison ma dernière condition if ( avec le submit ) est valide ( vu que mon log m'affiche mon okidokido ) si je me prends une belle nullpointerException ??? je précise que la ligne 149 correspond à la ligne du if avec le submit.

Surtout qu'avec firebug, je vois aussi mon paramètre submit valant addPatient.

Je vous remercie d'avance pour vos lumières ^^



juil. 05, 2016 6:01:55 PM org.apache.catalina.core.StandardWrapperValve invoke
GRAVE: "Servlet.service()" pour la servlet be.gestisoins.controllers.PatientManagement a généré une exception
java.lang.NullPointerException
at be.gestisoins.controllers.PatientManagement.doPost(PatientManagement.java:149)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:650)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:731)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:303)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:208)
at org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:52)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:241)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:208)
at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:220)
at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:122)
at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:505)
at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:169)
at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:103)
at org.apache.catalina.valves.AccessLogValve.invoke(AccessLogValve.java:956)
at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:116)
at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:423)
at org.apache.coyote.http11.AbstractHttp11Processor.process(AbstractHttp11Processor.java:1079)
at org.apache.coyote.AbstractProtocol$AbstractConnectionHandler.process(AbstractProtocol.java:625)
at org.apache.tomcat.util.net.JIoEndpoint$SocketProcessor.run(JIoEndpoint.java:318)
at java.util.concurrent.ThreadPoolExecutor.runWorker(Unknown Source)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(Unknown Source)
at org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:61)
at java.lang.Thread.run(Unknown Source)

2016-07-05 18:01:57:822 INFO be.gestisoins.controllers.PatientManagement: okidokido!




Mon bouton submit JSTL
<c:if test="${requestScope.content=='addPatient'}">
 <button class="btn btn-info center-block" type="submit" name="submit" id="addPatient" value="addPatient">Ajouter</button>
</c:if>



Mon bout de code de servlet ( le log est un log4j )

protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException 
 {
  //**************************************************//
  //  Récupération de data pour le select2              //
  //**************************************************//
  
  if ( request.getParameterMap().containsKey("info") &&
    request.getParameter("info").equals("cityLookup") &&
    request.getParameterMap().containsKey("cityLookup") &&
    request.getParameter("cityLookup").matches("[\\w]{2,100}")
   )
  { 
   // Test si le champ est valide
   if(request.getParameter("cityLookup").matches("[\\w]{2,100}"))
   {
    
    
    city = request.getParameter("cityLookup");    
    EntityFinder<Location> ef = new EntityFinderImpl<>();
    List<Location> loc;
    Map<String, Object> map = new HashMap<>();
    map.put("city", city);
   
    // Requête afin de trouver les records
    loc = ef.findByNamedQuery("Location.findWithWildCard", new Location(), map);
    log.info("Recherche de la localité");
    
    // Garnissage d'un tableau JSON avec des JSONObjects
    JSONObject json = new JSONObject();
    JSONArray location = new JSONArray();
    JSONObject obj;
    
    try 
    {
     for(Location l : loc)
     {
      obj = new JSONObject();
      
      obj.put("id", l.getIdLocation());
      obj.put("city", l.getCity());
      obj.put("zipCode", l.getZipCode());
      location.put(obj);
     }
     json.put("location", location);
    }
    catch (JSONException e) 
    {
     log.debug(e);
    }
        
    // Set du type de contenu pour la réponse
    response.setContentType("application/json");
          
    // Writer
    //response.getWriter().write(json);
    PrintWriter out = response.getWriter();
    out.print(json);
    out.flush(); 
   }
   
  }
  if(request.getParameter("submit").equals("active"))
  {
   log.info("okidokido!");
  
  }
   
  else log.error("Erreur lors de la recherche de ville");     
 }
}


2 réponses

KX Messages postés 16733 Date d'inscription samedi 31 mai 2008 Statut Modérateur Dernière intervention 31 janvier 2024 127
6 juil. 2016 à 00:21
Bonjour,

Si je simplifie ta question tu as :

if (request.getParameter("submit").equals("active")) // ligne 149
{
    log.info("okidokido!");
}

Qui te donne :

juil. 05, 2016 6:01:55 PM org.apache.catalina.core.StandardWrapperValve invoke
GRAVE: "Servlet.service()" pour la servlet be.gestisoins.controllers.PatientManagement a généré une exception
java.lang.NullPointerException
    at be.gestisoins.controllers.PatientManagement.doPost(PatientManagement.java:149)

2016-07-05 18:01:57:822 INFO  be.gestisoins.controllers.PatientManagement: okidokido!

Tu ne comprends comment tu peux avoir une Exception et un okidokido en même temps.

La réponse est simple, ces deux logs ont deux secondes d'écart (6:01:55 PM et 18:01:57:822), c'est trop long pour être deux lignes de codes qui se suivent. Par contre c'est un temps correct entre deux essais successifs de la même requête, la première qui plante, la seconde qui réussit.

Si tu modifies par exemple comme ceci :

log.info("Je suis avant");
if (request.getParameter("submit").equals("active"))

Tu obtiendras alors des logs comme ceci (avec deux fois "Je suis avant")

01:55 Je suis avant
01:55 NullPointerException
01:57 Je suis avant
01:57 okidokido

Sinon pour résoudre ton NPE tu peux simplement inverser la condition :

if ("active".equals(request.getParameter("submit")))
1
Bonjour,

Tout d'abord merci pour ta réponse.

J'avais tellement le nez dessus que je ne le voyais pas...

En fait je passe 2 fois dans cette servlet, une fois arrivé sur la page et une fois lors de la validation du formulaire.
Comme j'ai oublié de tester si le paramètre existe, et bien en arrivant sur la page je me prends cette NPE. Ensuite le test réussi car le paramètre existe quand mon formulaire est validé.

Merci encore ;-)
0
Rejoignez-nous