NullPointerException

Fermé
n4134 Messages postés 7 Date d'inscription samedi 16 juin 2018 Statut Membre Dernière intervention 16 juin 2018 - Modifié le 16 juin 2018 à 20:31
KX Messages postés 16752 Date d'inscription samedi 31 mai 2008 Statut Modérateur Dernière intervention 31 août 2024 - 17 juin 2018 à 00:10
Bonjour,
je débute en Java, je suis tombé sur la fameuse java.lang.NullPointerException
mais que dois faire pour régler ce problème?
Je sais certainement qu'un pointeur ne dois pointer justement sur rien, ou qu'il existe un problème d'indice,
mais en relisant mon code je ne vois pas ce qui provoque ceci,
si quelqu'un peut m'aider, ca m'aiderait énormément.

Le but de mon code est d'afficher graphiquement des obstacles par rapport a une voiture dont leurs distances sont reçu par bluetooth

import processing.serial.*; // importe la bibliotheque processing

Serial myPort; // définit l'objet serial
String comPortString;
int cell = 1;
String tabX[];
String tabY[];
int coordonneX;
int coordonneY;
int X;
int Y;


//Déclaration et création d'une instance de l'objet Balle
Balle maBalle = new Balle();

//*************************************************************

void setup() {
  smooth(); //Lissage des dessins
  size(400, 400); //Taille de la fenêtre
  myPort = new Serial(this, "COM9", 9600);//Classe pour recevoir des données et en transmettre en communication série
  
}

//**********************************************************

void draw() {
  fill(0, 0, 0, 200);
  rect(200, 200, 400, 400);
  quadrillage(); // trace quadrillage - cf fonction ci-dessous

  noStroke();

  //Déplacement et affichage de la balle
  serialEvent(myPort);
  maBalle.testCollision();
  maBalle.display();
  obstacle(cell,coordonneX,coordonneY);
  cell++;
  for(int i = 0; i < tabX.length; i++){
    rectMode(CENTER);
    X=Integer.parseInt(tabX[i]);
    Y=Integer.parseInt(tabY[i]);
    rect(X,Y,10,5);
   }
}

//****************************************************

void serialEvent(Serial cPort) {
  if (myPort.available() > 0) { // Si le com reçoit des données...
    comPortString = cPort.readStringUntil('\n'); // Lit les distances des 3 modules ligne par ligne
    if (comPortString != null) { //Si les valeurs de la ligne ne sont pas nul...
    String infos[] = split(comPortString, ','); // Place les distances dans un tableau, change de cellule a chaque affichage de :","
    maBalle.detection(int(infos[1]),int(infos[2]),int(infos[3])); // Renvoie les données dans la fonction DrawObject
    maBalle.bouge(int(infos[0]));
      
    }
  }
}

class Balle {
  //Déclaration des paramètres de base de la balle
  float x;
  float y;
  float vitesse;
  color couleur;

  //Constructeur de la balle
  Balle () {
    x       = 200;
    y       = 200;
    couleur = 125;
    vitesse = 2;

  }

  //Dessin de la balle
  void display() {
    fill(couleur);
    ellipse(x, y, 40, 40);
  }
  void detection(int m1, int m2, int m3){
    //print(m1,m2,m3);
    //println("~~~~~~~~~~~~~~~~~~~");
    if(m1<50){
      fill(0,250,0);
      rectMode(CENTER);
      coordonneX = round(x-(m1+20)/sqrt(2));
      coordonneY = round(y-(m1+20)/sqrt(2));
      //rect(x-(m1+20)/sqrt(2),y-(m1+20)/sqrt(2),10,5);
    }
    if(m2<50){
      fill(0,250,0);
      rectMode(CENTER);
      rect(x,y-(m1+20),10,5);
    }
    if(m3<50){
      fill(0,250,0);
      rectMode(CENTER);
      rect(x+(m1+20)/sqrt(2),y-(m1+20)/sqrt(2),10,5);
    }
  }

  void bouge(int direction) {
    if(direction==1){
      //Avancer
      y=y-vitesse;
    }
    if(direction==2){
      //Reculer
      y=y+vitesse;
      
    }
    if(direction==3){
      //Gauche
      x=x-vitesse;
      
    }
    if(direction==4){
      //Droite
      x=x+vitesse;
    }
  }

  void testCollision() {
    if (x > width-20 || x < 20) {
      vitesse = 0;
    }
    if (y > height-20 || y < 20) {
      vitesse = 0;
    }
  }
}

// fonction d'affichage du quadrillage
void quadrillage () {

 stroke(250,250,250); // fixe la couleur utilisée pour le tracé en RVB 

 // lignes verticales

 for (int i=1; i<=40; i++) {

   line (i*10,height-0,i*10,height-399); // trace une ligne verticale

 }

 // lignes horizontales 
 for (int i=1; i<40; i++) {

   line (0,height-(i*10),399,height-(i*10)); // trace ligne horizontale

 }
}

// Insertion des coordonnés X et Y dans une ligne du tableau
void obstacle(int cell, int coordonneX, int coordonneY){
    tabX[cell] = Integer.toString(coordonneX);
    tabY[cell] = Integer.toString(coordonneY);
}


EDIT : Ajout des balises de code (la coloration syntaxique).
Explications disponibles ici : ICI

Merci d'y penser dans tes prochains messages.

2 réponses

KX Messages postés 16752 Date d'inscription samedi 31 mai 2008 Statut Modérateur Dernière intervention 31 août 2024 3 019
16 juin 2018 à 20:44
Bonjour,

En Java quand tu as une exception il y a la stack complète qui est affichée. Exemple :

Exception in thread "main" java.lang.NullPointerException
at Test.main(Test.java:42)

L'information de cette stack est très importante pour retrouver l'erreur puisqu'elle t'indique la ligne exacte du code qui pose problème.

Dans Processing la ligne de code en question est même surlignée quand une exception est détectée.

Il serait donc utile que tu regardes déjà quelle ligne de code est concernée par l'erreur pour en déduire la cause du NullPointerException. Sachant que toutes les causes possibles sont documentées :
https://docs.oracle.com/javase/10/docs/api/java/lang/NullPointerException.html
0
n4134 Messages postés 7 Date d'inscription samedi 16 juin 2018 Statut Membre Dernière intervention 16 juin 2018
16 juin 2018 à 20:51
C'est pour la ligne 160 que j'ai un problème de pointeur, de ce fait pour la 161 aussi par déduction.
Mais j'ai toujours du mal à voir d'ou vient mon erreur.
0
KX Messages postés 16752 Date d'inscription samedi 31 mai 2008 Statut Modérateur Dernière intervention 31 août 2024 3 019
16 juin 2018 à 21:15
NullPointerException sur la ligne 160 :
tabX[cell] = Integer.toString(coordonneX);

Cela correspond à ce cas dans la documentation : "Accessing or modifying the slots of null as if it were an array."

tabX vaut null, donc tu ne peux pas accéder à une de ses cases, car tu n'as jamais initialisé le tableau.
À un moment dans ton code il faudrait que tu fasses
tabX = new String[42];
(avec la taille que tu veux)

Et donc pareil pour tabY pour le NullPointerException sur la ligne 161.
0
n4134 Messages postés 7 Date d'inscription samedi 16 juin 2018 Statut Membre Dernière intervention 16 juin 2018
16 juin 2018 à 21:20
D'accord je comprends mieux, merci.
Cependant la taille du tableau doit-elle être forcément fixe ? Car j'aurais voulu afficher un grand nombre de coordonnées.

Je vous remercie pour votre aide et votre explication !
0
KX Messages postés 16752 Date d'inscription samedi 31 mai 2008 Statut Modérateur Dernière intervention 31 août 2024 3 019 > n4134 Messages postés 7 Date d'inscription samedi 16 juin 2018 Statut Membre Dernière intervention 16 juin 2018
16 juin 2018 à 21:26
Il n'est pas nécessaire de connaître le nombre d'éléments au moment de la compilation, tu peux le calculer à l'exécution, par contre une fois le tableau créé il ne peut pas être redimensionné, sa taille est définitive.
0
n4134 Messages postés 7 Date d'inscription samedi 16 juin 2018 Statut Membre Dernière intervention 16 juin 2018
16 juin 2018 à 21:34
D'accord, merci beaucoup pour votre aide.
0
n4134 Messages postés 7 Date d'inscription samedi 16 juin 2018 Statut Membre Dernière intervention 16 juin 2018
16 juin 2018 à 21:42
Cependant je rencontre un nouveau problème ligne 42 : "NumberFormatException: null".
Est-ce lié avec le problème précédant ?
0