Bonjour,

Pendant que je cherche je voudrais être conseiller aiguiller/conseiller sur mon erreur de NullPointerException :

Voici mon erreur :

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
43
44
45
46
47
48
49
50
51
52
53
54
55
56

VelocityView : Error processing a template for path '/comptes/affilies.html.vtl'
Invocation of method 'getRemunerationVendeur' in class model.User threw exception java.lang.NullPointerException at /comptes/affilies.html.vtl[line 28, column 20]


java.lang.NullPointerException
	at model.User.getListRemunerationVendeur(User.java:238)
	at model.User.getRemunerationVendeur(User.java:268)
	at sun.reflect.GeneratedMethodAccessor75.invoke(Unknown Source)
	at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
	at java.lang.reflect.Method.invoke(Method.java:606)
	at org.apache.velocity.runtime.parser.node.PropertyExecutor.execute(PropertyExecutor.java:127)
	at org.apache.velocity.util.introspection.UberspectImpl$VelGetterImpl.invoke(UberspectImpl.java:523)
	at org.apache.velocity.runtime.parser.node.ASTIdentifier.execute(ASTIdentifier.java:198)
	at org.apache.velocity.runtime.parser.node.ASTReference.execute(ASTReference.java:271)
	at org.apache.velocity.runtime.parser.node.ASTReference.value(ASTReference.java:561)
	at org.apache.velocity.runtime.directive.VelocimacroProxy.handleArgValues(VelocimacroProxy.java:325)
	at org.apache.velocity.runtime.directive.VelocimacroProxy.render(VelocimacroProxy.java:189)
	at org.apache.velocity.runtime.directive.RuntimeMacro.render(RuntimeMacro.java:300)
	at org.apache.velocity.runtime.directive.RuntimeMacro.render(RuntimeMacro.java:230)
	at org.apache.velocity.runtime.parser.node.ASTDirective.render(ASTDirective.java:207)
	at org.apache.velocity.runtime.parser.node.ASTBlock.render(ASTBlock.java:72)
	at org.apache.velocity.runtime.directive.Foreach.renderBlock(Foreach.java:281)
	at org.apache.velocity.runtime.directive.Foreach.render(Foreach.java:258)
	at org.apache.velocity.runtime.parser.node.ASTDirective.render(ASTDirective.java:207)
	at org.apache.velocity.runtime.parser.node.SimpleNode.render(SimpleNode.java:342)
	at org.apache.velocity.Template.merge(Template.java:356)
	at org.apache.velocity.Template.merge(Template.java:260)
	at org.apache.velocity.tools.view.VelocityView.performMerge(VelocityView.java:942)
	at org.apache.velocity.tools.view.VelocityView.merge(VelocityView.java:902)
	at org.apache.velocity.tools.view.VelocityViewServlet.mergeTemplate(VelocityViewServlet.java:318)
	at org.apache.velocity.tools.view.VelocityViewServlet.doRequest(VelocityViewServlet.java:220)
	at org.apache.velocity.tools.view.VelocityViewServlet.doGet(VelocityViewServlet.java:182)
	at javax.servlet.http.HttpServlet.service(HttpServlet.java:120)
	at javax.servlet.http.HttpServlet.service(HttpServlet.java:97)
	at com.caucho.server.dispatch.ServletFilterChain.doFilter(ServletFilterChain.java:109)
	at filter.AuthFilter.doRedirect(AuthFilter.java:54)
	at velosurf.web.auth.AuthenticationFilter.doFilter(AuthenticationFilter.java:392)
	at com.caucho.server.dispatch.FilterFilterChain.doFilter(FilterFilterChain.java:89)
	at filter.DateFilter.doFilter(DateFilter.java:309)
	at com.caucho.server.dispatch.FilterFilterChain.doFilter(FilterFilterChain.java:89)
	at com.caucho.server.webapp.WebAppFilterChain.doFilter(WebAppFilterChain.java:156)
	at com.caucho.server.dispatch.ServletInvocation.service(ServletInvocation.java:289)
	at com.caucho.server.http.HttpRequest.handleRequest(HttpRequest.java:838)
	at com.caucho.network.listen.TcpSocketLink.dispatchRequest(TcpSocketLink.java:1345)
	at com.caucho.network.listen.TcpSocketLink.handleRequest(TcpSocketLink.java:1301)
	at com.caucho.network.listen.TcpSocketLink.handleRequestsImpl(TcpSocketLink.java:1285)
	at com.caucho.network.listen.TcpSocketLink.handleRequests(TcpSocketLink.java:1193)
	at com.caucho.network.listen.TcpSocketLink.handleAcceptTaskImpl(TcpSocketLink.java:992)
	at com.caucho.network.listen.ConnectionTask.runThread(ConnectionTask.java:117)
	at com.caucho.network.listen.ConnectionTask.run(ConnectionTask.java:93)
	at com.caucho.network.listen.SocketLinkThreadLauncher.handleTasks(SocketLinkThreadLauncher.java:169)
	at com.caucho.network.listen.TcpSocketAcceptThread.run(TcpSocketAcceptThread.java:61)
	at com.caucho.env.thread2.ResinThread2.runTasks(ResinThread2.java:173)
	at com.caucho.env.thread2.ResinThread2.run(ResinThread2.java:118)
Et voici ma classe java situé dans le package model :

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
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293

package model;

import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Calendar;
import java.util.Date;
import java.util.Iterator;
import java.util.List;
import java.util.Map;

import org.apache.velocity.tools.generic.MathTool;

import velosurf.context.AttributeReference;
import velosurf.context.DBReference;
import velosurf.context.Instance;

import tool.BoxtaleTool;
import tool.ReglementTool;
import util.BoxtaleLogger;
import util.BoxtaleUtils;

public class User extends Instance {

    protected static MathTool math = new MathTool();
    SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");

    // retourne l'en-cours d'un utilisateur
    public float getEncours() {
      // Sauvegarde des anciennes valeurs qu'on remettra en place par la suite.
      Object o1 = get("begin");
      Object o2 = get("end");
			// on met la date du jour pour recuperer le dernier encours sauvegardé
			put("begin", sdf.format(new Date()));
			Instance solde_prec = (Instance)get("solde_periode_precedente");
			if(solde_prec != null) {
				Calendar c = Calendar.getInstance();
				c.setTime((Date)solde_prec.get("date_solde"));
				c.add(Calendar.DAY_OF_MONTH, 1);
				put("begin", sdf.format(c.getTime()));
			} else {
	      put("begin", sdf.format((Date)get("date_creation")));
			}
  	  put("end", sdf.format(new Date()));
      float f = new ReglementTool().getSolde(this);
      // on remet en place les anciennes valeurs
      if(o1 != null) put("begin", o1);
      if(o2 != null) put("end", o2);
      return f;
    }

    public float getEncoursFacture() {
        float encours = (float)0.0;
        AttributeReference ar = (AttributeReference)get("factures_non_payees");
        for(Object o:ar) {
            if(!(o instanceof Facture)) continue; // todo : msg d'alerte
            encours += ((Facture)o).getMontantDu();
        }
        return encours;
    }

    public float getEncoursNonFacture() {
      float encours = (float)0.0;
      Facture f = (Facture)get("facture_en_cours");
      if(f != null) {
        encours += f.getMontant(true);
      }
      return encours;
    }

    // indique si avec la commande actuelle, on depasse ou non le seuil maximal autorise
    public boolean depassementAutoriseAtteint(float prix) {
        return (getEncours() + prix > (Float)get("encours_autorise"));
    }

    // NOTE : pas utile mais au cas ou j'aurais oublie un appel à updateMailConfiguration...
    public void updateMailConfiguration(String exp, String dst, String fact) {
      // on conserve la valeur du champ prelevement.
      updateMailConfiguration(exp, dst, fact, isPrelEmailActivated() ? "a" : "");
    }

    public void updateMailConfiguration(String exp, String dst, String fact, String prel) {
        if(exp.length() > 0) activateExpEmail(); else deactivateExpEmail();
        if(dst.length() > 0) activateDstEmail(); else deactivateDstEmail();
        if(fact.length() > 0) activateFactEmail(); else deactivateFactEmail();
        if(prel.length() > 0) activatePrelEmail(); else deactivatePrelEmail();

        this.update();
    }

    public boolean isExpEmailActivated() { return (((Integer)get("email_configuration") & BoxtaleTool.getMAIL_EXPEDITEUR()) != 0); }
    public boolean isDstEmailActivated() { return (((Integer)get("email_configuration") & BoxtaleTool.getMAIL_DESTINATAIRE()) != 0); }
    public boolean isFactEmailActivated() { return (((Integer)get("email_configuration") & BoxtaleTool.getMAIL_PAYEUR()) != 0); }
    public boolean isPrelEmailActivated() { return (((Integer)get("email_configuration") & BoxtaleTool.getMAIL_PRELEVEMENT()) != 0); }

    public void activateExpEmail() { put("email_configuration", (Integer)get("email_configuration") | BoxtaleTool.getMAIL_EXPEDITEUR()); }
    public void activateDstEmail() { put("email_configuration", (Integer)get("email_configuration") | BoxtaleTool.getMAIL_DESTINATAIRE()); }
    public void activateFactEmail() { put("email_configuration", (Integer)get("email_configuration") | BoxtaleTool.getMAIL_PAYEUR()); }
    public void activatePrelEmail() { put("email_configuration", (Integer)get("email_configuration") | BoxtaleTool.getMAIL_PRELEVEMENT()); }

    public void deactivateExpEmail() { put("email_configuration", (Integer)get("email_configuration") & (0xFFFFFFFF ^ BoxtaleTool.getMAIL_EXPEDITEUR()) ); }
    public void deactivateDstEmail() { put("email_configuration", (Integer)get("email_configuration") & (0xFFFFFFFF ^ BoxtaleTool.getMAIL_DESTINATAIRE()) ); }
    public void deactivateFactEmail() { put("email_configuration", (Integer)get("email_configuration") & (0xFFFFFFFF ^ BoxtaleTool.getMAIL_PAYEUR()) ); }
    public void deactivatePrelEmail() { put("email_configuration", (Integer)get("email_configuration") & (0xFFFFFFFF ^ BoxtaleTool.getMAIL_PRELEVEMENT()) ); }

    // methode utilitaire pour recuperer un compte operateur lie à cet utilisateur
    public Instance getOpeInfos(String ope_code) {
      return getOpeInfos(ope_code, null);
    }

    public Instance getOpeInfos(String ope_code, String srv_code) {
      put("ope_code", ope_code);
      if(srv_code != null) put("srv_code", srv_code);
      return (Instance)get("ope_account");
    }

    // recupère l'éventuel compte operateur du client puis effectue qqs verifications (cp d'enlèvement, ...)
    public boolean hasOperateurAccount(Offre o, Envoi e) {
      return hasOperateurAccount(o, e, true);
    }

    // 
    public boolean hasOperateurAccount(Offre o, Envoi e, boolean checkDays) {
      String srv_code = (String)o.get("srv_code");
      if(srv_code.endsWith("SY")) srv_code = srv_code.substring(0, srv_code.length()-2);

      Instance i = getOpeInfos((String)((Instance)o.get("operateur")).get("ope_code"), srv_code);
BoxtaleLogger.debug("[User.hasOperateurAccount] "+ get("login") + " - "+ ((Instance)o.get("operateur")).get("ope_code") + " - "+ o.get("srv_code") +" (considering "+srv_code+") ------> "+ i);

      // Si l'utilisateur n'a pas de compte, rien ne sert de continuer
      if(i == null) return false;

      // Verification du codepostal s'il est non null
      String cp = (String)i.get("codepostal");
      if(cp != null && cp.compareTo((String)((Instance)e.get("expediteur")).get("codepostal")) != 0) return false;
      
      String numero = (String)i.get("numero");
      if(numero == null || numero.trim().length() == 0) return false;

      if(checkDays) {
        Calendar DEP = (Calendar)o.get("DEP");
        // DEP peut etre nul si on arrive du backoffice.
        if(DEP == null || !isPickupDay((String)((Instance)o.get("operateur")).get("ope_code"), DEP.get(Calendar.DAY_OF_WEEK))) return false;
      }

      return true;
    }

    // Retourne le numero du compte que l'utilisateur possede chez l'operateur
    public String getOpeAccount(String ope_code) {
      Instance i = getOpeInfos(ope_code);
      return i != null ? (String)i.get("numero") : null;
    }

    // Indique si une offre est ouverte au pickup le jour donné
    public boolean isPickupDay(String ope_code, int jour) {
      Instance i = getOpeInfos(ope_code);
      if(i == null) return false;

      String key = getJourKey(jour);
      if(key != null) return (Boolean)i.get(key);
      
      return false;
    }

    public boolean setPickupDays(String ope_code, Map<String, Object> m) {
      Instance infos = getOpeInfos(ope_code);
      if(infos == null) return false;

      try {
        for(int i = Calendar.MONDAY; i<=Calendar.SATURDAY; i++) {
          if(m.get(""+i) != null) infos.put(getJourKey(i), true);
          else infos.put(getJourKey(i), false);
        }
        return infos.update();
      } catch(Exception e) {
        BoxtaleLogger.log("[User.setPickupDays] Une erreur est survenue lors de la mise a jour des jours de pickup pour "+ get("login") + " - "+ope_code+" - "+ m, e);
      }
      return false;
    }

    protected String getJourKey(int jour) {
      switch(jour) {
        case Calendar.MONDAY: return "lundi";
        case Calendar.TUESDAY: return "mardi";
        case Calendar.WEDNESDAY: return "mercredi";
        case Calendar.THURSDAY: return "jeudi";
        case Calendar.FRIDAY: return "vendredi";
        case Calendar.SATURDAY: return "samedi";
        default: return null;
      }
    }

    /**
     * Gestion du markup spécifique à l'utilisateur
     *
     */
    public Float getMarkup(Offre o) {
      // pas d'offre spécifiée, on ne peut pas récuupérer le markup.
      // TODO : error msg ?!?
      if(o == null) return null;

      put("ope_code", ((Instance)o.get("operateur")).get("ope_code"));
      put("srv_code", o.get("srv_code"));
      Instance i = (Instance)super.get("operateur_service_markup");
      if(i != null) return (Float)i.get("markup");
      else return null;
    }

    // Suivant les machines assurance tinyint(1) est considéré comme un entier ou comme un booleen
    // on uniformise le comportement.
    public Boolean getAssurance() {
      Object o = super.get("assurance");
      if(o instanceof Integer) return (Integer)o != 0;
      else if(o instanceof Boolean) return (Boolean)o;
      return true; // default
    }

    // Quelques methodes pour faciliter le calcul de stats

    public List<Instance> getListRemunerationVendeur() {
      List<Instance> result = new ArrayList<Instance>();
      DBReference db = BoxtaleUtils.getDBReference();
      Instance vendeur = (Instance)get("vendeur");
//BoxtaleLogger.debug("[User.getListRemunerationVendeur] @@@ Vendeur : "+ vendeur);
      if(vendeur == null) return null;
      List<Instance> envois = ((AttributeReference)get("envois_sur_periode")).getRows();
      for(Instance e:envois) {
        Integer etat = (Integer)e.get("envoi_etat");
        if(etat < 1 && etat != -4 && etat != -10) continue;
//BoxtaleLogger.debug("[User.getListRemunerationVendeur] @@@ Considering : "+ e.get("envoi_numfact")+e.get("envoi_reference"));
        String envoi_service = (String)e.get("envoi_service");
        db.put("ope", ((String)e.get("envoi_reference")).substring(0,4));
        Instance operateur = (Instance)db.get("operateur_by_code");
        db.put("ope_id", operateur.get("ope_id"));
        db.put("srv", envoi_service.substring(envoi_service.lastIndexOf(" ")+1));
        Instance service = (Instance)db.get("service_by_code");
        vendeur.put("ope_code", operateur.get("ope_code"));
        vendeur.put("srv_code", service.get("srv_code"));
        Instance rem = (Instance)vendeur.get("remuneration_ope_srv");
//BoxtaleLogger.debug("[User.getListRemunerationVendeur] @@@ Operateur : "+ operateur.get("ope_code")+" - service : "+ service.get("srv_code")+" - remuneration vendeur : "+ rem);
        if(rem == null) continue;
        Float remuneration_base = (Float)e.get("envoi_prix_nego_precond")+(Float)e.get("envoi_com");
        Float remuneration = (float)0.0;
        if(rem.get("fixe") != null) {
          remuneration = (Float)rem.get("fixe");
        } else {
          remuneration = ((Double)math.roundTo(2, remuneration_base * (Float)rem.get("pourcent") / (float)100.0)).floatValue();
        }
        e.put("remuneration_base", remuneration_base);
        e.put("remuneration", remuneration);
        result.add(e);
      }
      return result;
    }

    public Float getBaseRemunerationVendeur() {
      List<Instance> l = getListRemunerationVendeur();
      if(l == null || l.size() == 0) return (float)0.0;

      float rem = (float)0.0;
      for(Instance e:l) {
        rem += (Float)e.get("remuneration_base");
      }
      return rem;
    }

    public Float getRemunerationVendeur() {
      List<Instance> l = getListRemunerationVendeur();
      if(l == null || l.size() == 0) return (float)0.0;

      float rem = (float)0.0;
      for(Instance e:l) {
        rem += (Float)e.get("remuneration");
      }
      return rem;
    }

    // Indique si un utilisateur dispose d'une assurance spécifique 
    // sur le type contenu passé en paramètre.
    public boolean hasSpecificInsurance(int cont_id) {
      return getSpecificInsuranceInfo(cont_id) != null;
    }

    // Retourne les informations d'assurance sur le contenu si elles existent
    // ou null si ce n'est pas le cas.
    public Map getSpecificInsuranceInfo(int cont_id) {
      put("cont_id", cont_id);
      return (Map)getWithParams("assurance_by_contenu", this);
    }

}
Je voudrais des conseils sur la résolution de mon erreur.