Java lang null pointer exception
Bonjour,
je suis entrain de travailler sur un programme sur java en utilisant la bibliothèque Cplex pour résoudre un problème de routage des véhicules.
En exécutant mon programme la console m'affiche :java.lang.nullpointer exception.
Voici le code que j'ai conçu , je suis débutante en informatique et je ne sais pas si ma syntaxe est correcte.l'erreur pointe exactement sur la ligne soulignée.
//la matrice distance;
int i,j,k;
double[][][] preval = new double[14][14][7];
double[][][] solution_f = new double[14][14][7];
double[] liste_points_visites = {-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1} ;
double[][] distance ={{500,2.3,6.3,4.6,6.2,4.9,4.2,4.4,5.7,3,4,8.8,3.7,4.5,4.4},
{10.6,500,3.8,4.8,4.2,5.4,4.2,5,4.5,6.2,4.2,4.6,3.5,4.7},
{5.8,4,500,1.7,0.8,1.5,0.4,1.1,3.8,1.6,6.8,1,2.3,1.3},
{4.7,3.8,2,500,1.9,3.1,1.9,2.7,1.7,1.6,2.2,2.4,0.3,2.4},
{6.2,1,0.4,3.3,500,2.3,1.2,1.8,4.6,2.5,4.2,2.1,2.2,1.2},
{4.9,1.3,1.4,0.9,2.8,500,1.1,0.8,4.8,1.3,4.1,0.6,3.3,0.4},
{3.7,0.4,3,3.3,1.2,1.1,500,0.7,3.7,1.1,3,0.5,2.2,0.8},
{3.7,0.4,3,3.3,2.4,0.4,0.7,500,4.4,1.2,3.7,0.4,2.9,1.5},
{3.5,3,5,1.4,2.3,3.4,2.2,3,500,2.6,1.5,2.7,1.6,4.8},
{3.6,0.5,2.8,2,2.2,1.5,1.1,1.2,3.8,500,3.2,0.8,1.9,1.2},
{3.7,0.4,3.3,4.3,3.3,4.4,3.2,4,1.6,4.6,500,3.7,2.6,3.5},
{3,0.4,3.2,3.3,2.5,0.7,0.5,0.4,4,0.8,3.4,500,2.5,0.6},
{3,3,3.3,0.4,2.5,4.8,2.4,4.4,1.4,2.4,2.4,3.7,500,2.6},
{3,0.5,2,3.3,1.9,1.2,0.4,0.8,4.1,1.2,3.5,0.6,2.6,500}};
double[] cadence = {7,1,2,1,3,1,1,2,3,1,1,2,2,1};
double[] demande = {0,90,110,100,57,60,90,40,60,70,50,70,60,70};
double ca=600;
double vitesse=1.33;
double temps_tr=15;
int p=0;
int m=0;
//les variables de decisions
IloNumVar[][][] x = new IloNumVar[14][14][7];
IloNumVar[][] y =new IloNumVar[14][7];
IloNumVar[][][][] z = new IloNumVar[14][14][7][1000];
for(i=0; i<=13;i++)
{
y[i] = cplex.numVarArray(7, 0, 1, IloNumVarType.Int); //chaque i contient 7 valeurs ;
}
for(i=0; i<=13;i++)
{
for(j=0; j<=13;j++)
{
x[i][j] = cplex.numVarArray(7, 0, 1, IloNumVarType.Int);//chaque couple (i , j) contient 7 termes
}
}
for(i=0; i<=13;i++)// construction de la fonction objective;
{
for(j=0; j<=13;j++)
{
for(k=0; k<=6;k++)
{
expr.addTerm(distance[i][j],x[i][j][k]);
}
}
}
// minimiser la fonction objective;
IloObjective obj = cplex.minimize(expr);
cplex.add(obj);
// un camion va vers un seul client;
for(i=0; i<=13;i++)
{
for(k=0; k<=6;k++)
{
cplex.addEq(cplex.sum( x[i][0][k],
x[i][1][k],
x[i][2][k],
x[i][3][k],
x[i][4][k],
x[i][5][k],
x[i][6][k],
cplex.sum(
x[i][7][k],
x[i][8][k],
x[i][9][k],
x[i][10][k],
x[i][11][k],
x[i][12][k],
x[i][13][k])),
y[i][k]);
}
}
// un camion vient d'un seul client;
for(j=0; j<=13;j++)
{
for(k=0; k<=6;k++)
{
cplex.addEq(cplex.sum( x[0][j][k],
x[1][j][k],
x[2][j][k],
x[3][j][k],
x[4][j][k],
x[5][j][k],
x[6][j][k],
cplex.sum(
x[7][j][k],
x[8][j][k],
x[9][j][k],
x[10][j][k],
x[11][j][k],
x[12][j][k],
x[13][j][k])),
y[j][k]);
}
}
// un client est visité autant de fois que sa cadence;
for(i=0; i<=13;i++)
{
cplex.addEq(cplex.sum( y[i][0],
y[i][1],
y[i][2],
y[i][3],
y[i][4],
y[i][5],
y[i][6]),
cadence[i]);
}
// les demandes ramassées par un camion doivent etre inférieures à sa capacité;
for(k=0; k<=6;k++)
{
cplex.addLe(cplex.sum(
cplex.prod(demande[0],y[0][k]),
cplex.prod(demande[1],y[1][k]),
cplex.prod(demande[2],y[2][k]),
cplex.prod(demande[3],y[3][k]),
cplex.prod(demande[4],y[4][k]),
cplex.prod(demande[5],y[5][k]),
cplex.prod(demande[6],y[6][k]),
cplex.sum(
cplex.prod(demande[7],y[7][k]),
cplex.prod(demande[8],y[8][k]),
cplex.prod(demande[9],y[9][k]),
cplex.prod(demande[10],y[10][k]),
cplex.prod(demande[11],y[11][k]),
cplex.prod(demande[12],y[12][k]),
cplex.prod(demande[13],y[13][k])
)),ca);
}
if ( cplex.solve() )
//remplissage de la matrice des valeurs provisoires preval
for(i=0; i<=13;i++)
{
for(j=0; j<=13;j++)
{
double[] tmp = cplex.getValues(x[i][j]);
for(k=0; k<=6;k++)
{
preval[i][j][k]=tmp[k];
}
}
}
//verification des subtours ;
int cmp=0;
int indice_point_visite=0;
boolean construire_chemin=true;
double []valeur_somme=new double[7];
int nbr=0;
int [][] nombre=new int [7][1000];
boolean subtour_found=true;
while (subtour_found)
{
for(k=0; k<=6;k++)
{
while(construire_chemin)
{
j=0;
while(preval[cmp][j][k]==0 )
{
j++;
}
if(j!=0)
{
cmp=j;
liste_points_visites[indice_point_visite]=j;
indice_point_visite++;
}
else
{
construire_chemin=false;
}
}
IloLinearNumExpr out_depot = cplex.linearNumExpr();
for(i=0; i<=13;i++)
{
for ( j =0;j<=13;j++)
{
if(
i!= liste_points_visites[0] &&
i!= liste_points_visites[1] &&
i!= liste_points_visites[2] &&
i!= liste_points_visites[3] &&
i!= liste_points_visites[4] &&
i!= liste_points_visites[5] &&
i!= liste_points_visites[6] &&
i!= liste_points_visites[7] &&
i!= liste_points_visites[8] &&
i!= liste_points_visites[9] &&
i!= liste_points_visites[10] &&
i!= liste_points_visites[11] &&
i!= liste_points_visites[12] &&
i!= liste_points_visites[13] &&
j!= liste_points_visites[0] &&
j!= liste_points_visites[1] &&
j!= liste_points_visites[2] &&
j!= liste_points_visites[3] &&
j!= liste_points_visites[4] &&
j!= liste_points_visites[5] &&
j!= liste_points_visites[6] &&
j!= liste_points_visites[7] &&
j!= liste_points_visites[8] &&
j!= liste_points_visites[9] &&
j!= liste_points_visites[10] &&
j!= liste_points_visites[11] &&
j!= liste_points_visites[12] &&
j!= liste_points_visites[13] )
{
out_depot.addTerm(1,x[i][j][k]);
}
}
}
valeur_somme[k]=cplex.getValue(out_depot);
}
if ( ( valeur_somme[0])!=0 ||
(valeur_somme[1])!=0 ||
(valeur_somme[2])!=0 ||
(valeur_somme[3])!=0 ||
(valeur_somme[4])!=0 ||
(valeur_somme[5])!=0 ||
(valeur_somme[6])!=0 )
{
for(k=0; k<=6;k++)
{
while(construire_chemin)
{
j=0;
while(preval[cmp][j][k]==0 )
{
j++;
}
if(j!=0)
{
cmp=j;
liste_points_visites[indice_point_visite]=j;
indice_point_visite++;
}
else
{
construire_chemin=false;
}
}
IloLinearNumExpr somme_hors_depot = cplex.linearNumExpr();
for ( i =0;i<=13;i++)
{
for ( j =0;j<=13;j++)
{
if( preval[i][j][k]==1 &&
i!= liste_points_visites[0] &&
i!= liste_points_visites[1] &&
i!= liste_points_visites[2] &&
i!= liste_points_visites[3] &&
i!= liste_points_visites[4] &&
i!= liste_points_visites[5] &&
i!= liste_points_visites[6] &&
i!= liste_points_visites[7] &&
i!= liste_points_visites[8] &&
i!= liste_points_visites[9] &&
i!= liste_points_visites[10] &&
i!= liste_points_visites[11] &&
i!= liste_points_visites[12] &&
i!= liste_points_visites[13] &&
j!= liste_points_visites[0] &&
j!= liste_points_visites[1] &&
j!= liste_points_visites[2] &&
j!= liste_points_visites[3] &&
j!= liste_points_visites[4] &&
j!= liste_points_visites[5] &&
j!= liste_points_visites[6] &&
j!= liste_points_visites[7] &&
j!= liste_points_visites[8] &&
j!= liste_points_visites[9] &&
j!= liste_points_visites[10] &&
j!= liste_points_visites[11] &&
j!= liste_points_visites[12] &&
j!= liste_points_visites[13] )
{
preval[i][j][k] =cplex.getValue( z[i][j][k][p]);
somme_hors_depot.addTerm(1,x[i][j][k]);
nbr++;
}
}
}
nbr=nombre[k][p];
cplex.addLe (somme_hors_depot, nbr-1);
}
{
//solve the problem
cplex.solve();
p++;
}
//ajout des contraintes cumulées//
IloLinearNumExpr somme_hors_depot = cplex.linearNumExpr();
for(m=0;m<=p;m++)
{
for(k=0;k<=6;k++)
{
for( i=0;i<=13;i++)
{
for ( j=0;j<=13;j++)
{
if( cplex.getValue(z[i][j][k][m])==1)
{
somme_hors_depot.addTerm(x[i][j][k] ,1);
}
}
}
cplex.addLe(somme_hors_depot,nombre[k][m]);
}
}
}
else
{
subtour_found=false;
}
}
//affichage des resultats , prendre les resultats dans une matrice
cplex.output().println("etat :"+ cplex.getStatus()+" la fonction objective ;) :"+cplex.getObjValue());
{
for(i=0; i<=13;i++)
{
for(j=0; j<=13;j++)
{
double[] xval = cplex.getValues(x[i][j]);
for(k=0; k<=6;k++)
{
solution_f[i][j][k]=xval[k];
}
}
}
for(k=0; k<=6;k++)
{
for(i=0; i<=13;i++)
{
for(j=0; j<=13;j++)
{
cplex.output().println("x["+i+"]["+j+"]["+k+"]= "+solution_f[i][j][k]);
}
}
}
}
je suis entrain de travailler sur un programme sur java en utilisant la bibliothèque Cplex pour résoudre un problème de routage des véhicules.
En exécutant mon programme la console m'affiche :java.lang.nullpointer exception.
Voici le code que j'ai conçu , je suis débutante en informatique et je ne sais pas si ma syntaxe est correcte.l'erreur pointe exactement sur la ligne soulignée.
//la matrice distance;
int i,j,k;
double[][][] preval = new double[14][14][7];
double[][][] solution_f = new double[14][14][7];
double[] liste_points_visites = {-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1} ;
double[][] distance ={{500,2.3,6.3,4.6,6.2,4.9,4.2,4.4,5.7,3,4,8.8,3.7,4.5,4.4},
{10.6,500,3.8,4.8,4.2,5.4,4.2,5,4.5,6.2,4.2,4.6,3.5,4.7},
{5.8,4,500,1.7,0.8,1.5,0.4,1.1,3.8,1.6,6.8,1,2.3,1.3},
{4.7,3.8,2,500,1.9,3.1,1.9,2.7,1.7,1.6,2.2,2.4,0.3,2.4},
{6.2,1,0.4,3.3,500,2.3,1.2,1.8,4.6,2.5,4.2,2.1,2.2,1.2},
{4.9,1.3,1.4,0.9,2.8,500,1.1,0.8,4.8,1.3,4.1,0.6,3.3,0.4},
{3.7,0.4,3,3.3,1.2,1.1,500,0.7,3.7,1.1,3,0.5,2.2,0.8},
{3.7,0.4,3,3.3,2.4,0.4,0.7,500,4.4,1.2,3.7,0.4,2.9,1.5},
{3.5,3,5,1.4,2.3,3.4,2.2,3,500,2.6,1.5,2.7,1.6,4.8},
{3.6,0.5,2.8,2,2.2,1.5,1.1,1.2,3.8,500,3.2,0.8,1.9,1.2},
{3.7,0.4,3.3,4.3,3.3,4.4,3.2,4,1.6,4.6,500,3.7,2.6,3.5},
{3,0.4,3.2,3.3,2.5,0.7,0.5,0.4,4,0.8,3.4,500,2.5,0.6},
{3,3,3.3,0.4,2.5,4.8,2.4,4.4,1.4,2.4,2.4,3.7,500,2.6},
{3,0.5,2,3.3,1.9,1.2,0.4,0.8,4.1,1.2,3.5,0.6,2.6,500}};
double[] cadence = {7,1,2,1,3,1,1,2,3,1,1,2,2,1};
double[] demande = {0,90,110,100,57,60,90,40,60,70,50,70,60,70};
double ca=600;
double vitesse=1.33;
double temps_tr=15;
int p=0;
int m=0;
//les variables de decisions
IloNumVar[][][] x = new IloNumVar[14][14][7];
IloNumVar[][] y =new IloNumVar[14][7];
IloNumVar[][][][] z = new IloNumVar[14][14][7][1000];
for(i=0; i<=13;i++)
{
y[i] = cplex.numVarArray(7, 0, 1, IloNumVarType.Int); //chaque i contient 7 valeurs ;
}
for(i=0; i<=13;i++)
{
for(j=0; j<=13;j++)
{
x[i][j] = cplex.numVarArray(7, 0, 1, IloNumVarType.Int);//chaque couple (i , j) contient 7 termes
}
}
for(i=0; i<=13;i++)// construction de la fonction objective;
{
for(j=0; j<=13;j++)
{
for(k=0; k<=6;k++)
{
expr.addTerm(distance[i][j],x[i][j][k]);
}
}
}
// minimiser la fonction objective;
IloObjective obj = cplex.minimize(expr);
cplex.add(obj);
// un camion va vers un seul client;
for(i=0; i<=13;i++)
{
for(k=0; k<=6;k++)
{
cplex.addEq(cplex.sum( x[i][0][k],
x[i][1][k],
x[i][2][k],
x[i][3][k],
x[i][4][k],
x[i][5][k],
x[i][6][k],
cplex.sum(
x[i][7][k],
x[i][8][k],
x[i][9][k],
x[i][10][k],
x[i][11][k],
x[i][12][k],
x[i][13][k])),
y[i][k]);
}
}
// un camion vient d'un seul client;
for(j=0; j<=13;j++)
{
for(k=0; k<=6;k++)
{
cplex.addEq(cplex.sum( x[0][j][k],
x[1][j][k],
x[2][j][k],
x[3][j][k],
x[4][j][k],
x[5][j][k],
x[6][j][k],
cplex.sum(
x[7][j][k],
x[8][j][k],
x[9][j][k],
x[10][j][k],
x[11][j][k],
x[12][j][k],
x[13][j][k])),
y[j][k]);
}
}
// un client est visité autant de fois que sa cadence;
for(i=0; i<=13;i++)
{
cplex.addEq(cplex.sum( y[i][0],
y[i][1],
y[i][2],
y[i][3],
y[i][4],
y[i][5],
y[i][6]),
cadence[i]);
}
// les demandes ramassées par un camion doivent etre inférieures à sa capacité;
for(k=0; k<=6;k++)
{
cplex.addLe(cplex.sum(
cplex.prod(demande[0],y[0][k]),
cplex.prod(demande[1],y[1][k]),
cplex.prod(demande[2],y[2][k]),
cplex.prod(demande[3],y[3][k]),
cplex.prod(demande[4],y[4][k]),
cplex.prod(demande[5],y[5][k]),
cplex.prod(demande[6],y[6][k]),
cplex.sum(
cplex.prod(demande[7],y[7][k]),
cplex.prod(demande[8],y[8][k]),
cplex.prod(demande[9],y[9][k]),
cplex.prod(demande[10],y[10][k]),
cplex.prod(demande[11],y[11][k]),
cplex.prod(demande[12],y[12][k]),
cplex.prod(demande[13],y[13][k])
)),ca);
}
if ( cplex.solve() )
//remplissage de la matrice des valeurs provisoires preval
for(i=0; i<=13;i++)
{
for(j=0; j<=13;j++)
{
double[] tmp = cplex.getValues(x[i][j]);
for(k=0; k<=6;k++)
{
preval[i][j][k]=tmp[k];
}
}
}
//verification des subtours ;
int cmp=0;
int indice_point_visite=0;
boolean construire_chemin=true;
double []valeur_somme=new double[7];
int nbr=0;
int [][] nombre=new int [7][1000];
boolean subtour_found=true;
while (subtour_found)
{
for(k=0; k<=6;k++)
{
while(construire_chemin)
{
j=0;
while(preval[cmp][j][k]==0 )
{
j++;
}
if(j!=0)
{
cmp=j;
liste_points_visites[indice_point_visite]=j;
indice_point_visite++;
}
else
{
construire_chemin=false;
}
}
IloLinearNumExpr out_depot = cplex.linearNumExpr();
for(i=0; i<=13;i++)
{
for ( j =0;j<=13;j++)
{
if(
i!= liste_points_visites[0] &&
i!= liste_points_visites[1] &&
i!= liste_points_visites[2] &&
i!= liste_points_visites[3] &&
i!= liste_points_visites[4] &&
i!= liste_points_visites[5] &&
i!= liste_points_visites[6] &&
i!= liste_points_visites[7] &&
i!= liste_points_visites[8] &&
i!= liste_points_visites[9] &&
i!= liste_points_visites[10] &&
i!= liste_points_visites[11] &&
i!= liste_points_visites[12] &&
i!= liste_points_visites[13] &&
j!= liste_points_visites[0] &&
j!= liste_points_visites[1] &&
j!= liste_points_visites[2] &&
j!= liste_points_visites[3] &&
j!= liste_points_visites[4] &&
j!= liste_points_visites[5] &&
j!= liste_points_visites[6] &&
j!= liste_points_visites[7] &&
j!= liste_points_visites[8] &&
j!= liste_points_visites[9] &&
j!= liste_points_visites[10] &&
j!= liste_points_visites[11] &&
j!= liste_points_visites[12] &&
j!= liste_points_visites[13] )
{
out_depot.addTerm(1,x[i][j][k]);
}
}
}
valeur_somme[k]=cplex.getValue(out_depot);
}
if ( ( valeur_somme[0])!=0 ||
(valeur_somme[1])!=0 ||
(valeur_somme[2])!=0 ||
(valeur_somme[3])!=0 ||
(valeur_somme[4])!=0 ||
(valeur_somme[5])!=0 ||
(valeur_somme[6])!=0 )
{
for(k=0; k<=6;k++)
{
while(construire_chemin)
{
j=0;
while(preval[cmp][j][k]==0 )
{
j++;
}
if(j!=0)
{
cmp=j;
liste_points_visites[indice_point_visite]=j;
indice_point_visite++;
}
else
{
construire_chemin=false;
}
}
IloLinearNumExpr somme_hors_depot = cplex.linearNumExpr();
for ( i =0;i<=13;i++)
{
for ( j =0;j<=13;j++)
{
if( preval[i][j][k]==1 &&
i!= liste_points_visites[0] &&
i!= liste_points_visites[1] &&
i!= liste_points_visites[2] &&
i!= liste_points_visites[3] &&
i!= liste_points_visites[4] &&
i!= liste_points_visites[5] &&
i!= liste_points_visites[6] &&
i!= liste_points_visites[7] &&
i!= liste_points_visites[8] &&
i!= liste_points_visites[9] &&
i!= liste_points_visites[10] &&
i!= liste_points_visites[11] &&
i!= liste_points_visites[12] &&
i!= liste_points_visites[13] &&
j!= liste_points_visites[0] &&
j!= liste_points_visites[1] &&
j!= liste_points_visites[2] &&
j!= liste_points_visites[3] &&
j!= liste_points_visites[4] &&
j!= liste_points_visites[5] &&
j!= liste_points_visites[6] &&
j!= liste_points_visites[7] &&
j!= liste_points_visites[8] &&
j!= liste_points_visites[9] &&
j!= liste_points_visites[10] &&
j!= liste_points_visites[11] &&
j!= liste_points_visites[12] &&
j!= liste_points_visites[13] )
{
preval[i][j][k] =cplex.getValue( z[i][j][k][p]);
somme_hors_depot.addTerm(1,x[i][j][k]);
nbr++;
}
}
}
nbr=nombre[k][p];
cplex.addLe (somme_hors_depot, nbr-1);
}
{
//solve the problem
cplex.solve();
p++;
}
//ajout des contraintes cumulées//
IloLinearNumExpr somme_hors_depot = cplex.linearNumExpr();
for(m=0;m<=p;m++)
{
for(k=0;k<=6;k++)
{
for( i=0;i<=13;i++)
{
for ( j=0;j<=13;j++)
{
if( cplex.getValue(z[i][j][k][m])==1)
{
somme_hors_depot.addTerm(x[i][j][k] ,1);
}
}
}
cplex.addLe(somme_hors_depot,nombre[k][m]);
}
}
}
else
{
subtour_found=false;
}
}
//affichage des resultats , prendre les resultats dans une matrice
cplex.output().println("etat :"+ cplex.getStatus()+" la fonction objective ;) :"+cplex.getObjValue());
{
for(i=0; i<=13;i++)
{
for(j=0; j<=13;j++)
{
double[] xval = cplex.getValues(x[i][j]);
for(k=0; k<=6;k++)
{
solution_f[i][j][k]=xval[k];
}
}
}
for(k=0; k<=6;k++)
{
for(i=0; i<=13;i++)
{
for(j=0; j<=13;j++)
{
cplex.output().println("x["+i+"]["+j+"]["+k+"]= "+solution_f[i][j][k]);
}
}
}
}
1 réponse
-
ModérateurBonjour,
preval[i][j][k] =cplex.getValue( z[i][j][k][p])
Le NuillPointerException peut venir de plusieurs endroits ici, il faut faire des tests pour identifier le problème :
if (preval==null) throw new NullPointerException("preval is null"); if (preval[i]==null) throw new NullPointerException("preval["+i+"] is null"); if (preval[i][j]==null) throw new NullPointerException("preval["+i+"]["+j+"] is null"); if (cplex==null) throw new NullPointerException("cplex is null"); if (z==null) throw new NullPointerException("z is null"); if (z[i]==null) throw new NullPointerException("z["+i+"] is null"); if (z[i][j]==null) throw new NullPointerException("z["+i+"]["+j+"] is null"); if (z[i][j][k]==null) throw new NullPointerException("z["+i+"]["+j+"]["+k+"] is null");