NullPointerException
n4134
Messages postés
7
Statut
Membre
-
KX Messages postés 19031 Statut Modérateur -
KX Messages postés 19031 Statut Modérateur -
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
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
Bonjour,
En Java quand tu as une exception il y a la stack complète qui est affichée. Exemple :
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
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
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.
Mais j'ai toujours du mal à voir d'ou vient mon erreur.
NullPointerException sur la ligne 160 :
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
Et donc pareil pour tabY pour le NullPointerException sur la ligne 161.
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.