Nullpointerexception / NaN error

Du kan i dette forum stille og svare på spørgsmål vedrørende Java programmering på alle typer platforme.
Besvar
Josefine
Geni
Geni
Indlæg:308
Tilmeldt:9. dec 2011, 16:46
Nullpointerexception / NaN error

Indlæg af Josefine » 5. mar 2015, 10:06

Hej. Jeg er i gang med at prøve at ændre baggrundsfarvens lysstyrke i Processing alt afhængig af, hvad værdien for variablen brightness bliver. Pt. har jeg dog bare sat background(0,0,80) - altså 80 i stedet for brightness, da jeg er løbet ind i et problem. Og ja, ved godt at background skal ned i draw-funktionen bagefter...
Jeg har en Aduino Uno, som er koblet til min computer via USB. Der er en lyssensor, som opfanger lys og returnerer en værdi afhængig af, hvor lyst det er. Lyssensoren virker fint, og jeg kan godt modtage dataene fra den. Men det er, som om at når jeg i Processing konverterer til float, så sker der et eller andet, der gør, at værdien bliver lig null.

Nogle gange virker det og så alligevel ikke, andre gange gider den ikke engang starte. Jeg så på et tidspunkt, at println returnerede NaN (not a number), så derfor tænkte jeg, at det kunne have noget med float() at gøre. Processing markerer linjen brightness = float(myPort.readStringUntil('\n')); som fejlen.
Jeg er ikke så erfaren inden for hverken Arduino eller Processing, og jeg havde en del problemer med at få Processing til at læse inputtet fra lyssensoren som int eller float, så jeg har muligvis gjort det forkert.

Da nullpointerexception-fejlen er Java-baseret, tænkte jeg, at nogen herinde måske kan hjælpe?

Kode for Arduino:

Kode: Vælg alt

int light = A2;

void setup(){
  Serial.begin(9600);
}

void loop(){
  int val = map(analogRead(light),0,1023,0,255);
  Serial.println(val);
  delay(1000);
}
Kode for Processing:

Kode: Vælg alt

import processing.serial.*;

Serial myPort;  // Create object from Serial class
float brightness = 1;

void setup(){
  background(0,0,80);
  size(100,100);
  String portName = Serial.list()[2]; //change the 0 to a 1 or 2 etc. to match your port
  myPort = new Serial(this, portName, 9600); 
}

void draw()
{
  if ( myPort.available() > 0) 
  {
  brightness = float(myPort.readStringUntil('\n'));
  println(brightness);
  }
  
}


Josefine
Geni
Geni
Indlæg:308
Tilmeldt:9. dec 2011, 16:46

Re: Nullpointerexception / NaN error

Indlæg af Josefine » 6. mar 2015, 09:50

Hmm, nå. Jeg fandt ud af at få rettet koden, så programmet ikke crasher, når jeg får returneret null. Programmet kan godt køre nu, selvom den returnerer null, men jeg gad godt vide grunden til, at null-værdien dukker op ind imellem. Jeg går ud fra, at det har noget at gøre med, at dataene fra Arduionoens lyssensor ikke bliver registreret i Processing i tide eller et-eller-andet i den stil.
Nå, men så længe det virker, så går det nok :D

cristian
Moderator
Moderator
Indlæg:882
Tilmeldt:26. sep 2011, 21:31
Kontakt:

Re: Nullpointerexception / NaN error

Indlæg af cristian » 6. mar 2015, 15:27

Hej Josefine, lang tid siden :)

Ved at "gribe" din nullpointer exception kan du sørge for at programmet ikke crasher, og evt køre koden der skal læse værdien igen
indtil du får den værdi du skal bruge.

Umiddelbart kan jeg fra det du har postet ikke gennemskue dit problem, har du mulighed for at uploade hele projektet?
Så kører jeg det ind i eclipse over weekenden og ser om jeg kan se noget.

jepperask
Geni
Geni
Indlæg:378
Tilmeldt:4. nov 2012, 17:57

Re: Nullpointerexception / NaN error

Indlæg af jepperask » 6. mar 2015, 19:15

Du har et helt sekunds delay mellem dine udskrivninger, så det burde ikke give problemer med bufferen - men det er nok lettere for dig at undersøge mens du tester det. Du siger at den engang i mellem fejler?

Hvor er det helt præcist du får null?
Er det når du printer med: println(brightness); eller linjen før hvor du konverterer dit input til float?

Ved du at float(string) fungerer? Prøv evt. og ændre den (string to float) oversættelse.

Der er et godt svar i den her tråd:
http://stackoverflow.com/questions/1820 ... oat-or-int
char floatbuf[32]; // make this at least big enough for the whole string
curLongitude.toCharArray(floatbuf, sizeof(floatbuf));
float f = atof(floatbuf);
Ellers er der også Arduino's toFloat() her.
http://arduino.cc/en/Reference/StringToFloat

Ville gerne teste det for dig, men har desværre ingen Arduino mere. :-)

Josefine
Geni
Geni
Indlæg:308
Tilmeldt:9. dec 2011, 16:46

Re: Nullpointerexception / NaN error

Indlæg af Josefine » 7. mar 2015, 10:28

Tak for jeres svar.

Jeg tror det har noget at gøre med data transmissionen mellem Arduino og computeren til Processing. I hvert fald har det givet mig problemer med programmeringen senere hen - jeg har måttet sætte frameraten helt ned til 5 for at Processing ikke kører for hurtigt i forhold til Arduinoen, så jeg kunne køre nogle if-statements... Jeg prøvede at pille lidt ved baud rate i Arduino, men det gjorde kun tingene værre.
Jeg har slet ikke styr på det med at få tingene til at synkronisere ordentligt, så hvis der er nogle der har forstand på sådan noget er de meget velkomne til at belære mig :P

Hvad angår spørgsmålet om, hvornår jeg får null - jeg har virkelig ingen anelse. Den kommer og går fuldstændig tilfældigt, og derfor har jeg svært ved at identificere problemet. Som sagt tror jeg det har noget at gøre med, at Processing ikke når at opfatte data-inputs fra Arduino, men det er kun et gæt. Jeg prøvede også at sætte delay væk fra Arduino, men ak.
Dette har ført meget mærkelige problemer med sig da jeg senere forsøgte at bruge OOP, og jeg har måttet ty til mindre smarte programmeringsmetoder for at få det til at fungere, men ja, som sagt - det "virker" :|
float(string) fungerer som den skal, men der er et eller andet ved den linje.

Jeg bør nok fortælle, hvad jeg virkelig er i gang med: nemlig et p-plads system, der skal registrere ledige p-pladser og sende disse informationer til en "gps" (processing). Det er self. for sjov - en model til et teknologiprojekt. Jeg har en arduino med 5 lyssensorer, der registrer, om der er lyst eller mørkt. Arduino er programmet til at registrere, hvor mange p-pladser, der er ledige (ledig = lyst, fordi bilen ikke skygger), og disse data bliver send til Processing, som skal vise det grafiske (GPS'en).
I kan se hele koden her:

Arduino

Kode: Vælg alt

int threshold = 80;
int sensors[] = {0,0,0,0,0};
int led1 = 5;
int led2 = 6;

void setup(){
  Serial.begin(9600);
  pinMode(led1, OUTPUT);
  pinMode(led2, OUTPUT);
}

void loop(){
  //konverter sensor range (0 - højt tal) til color-range (0 - 255)
  //** why is threshold 191 and not 255???
  
  //A0 - 1. stik
  if(map(analogRead(A0),0,1023,0,255) > threshold){
    sensors[0] = 1;
  } else{
    sensors[0] = 0;
  }
  
  //A1 - 2. stik
  if(map(analogRead(A1),0,1023,0,255) > threshold){
    sensors[1] = 1;
  } else{
    sensors[1] = 0;
  }
 
  //A2 - 3. stik
  if(map(analogRead(A2),0,1023,0,255) > threshold){
    sensors[2] = 1;
  } else{
    sensors[2] = 0;
  }
  
  //A3 - 4. stik
  if(map(analogRead(A3),0,1023,0,255) > threshold){
    sensors[3] = 1;
  } else{
    sensors[3] = 0;
  }
 
  //A4 - 5. stik
  if(map(analogRead(A4),0,1023,0,255) > threshold){
    sensors[4] = 1;
  } else{
    sensors[4] = 0;
  }
  
  int seats_available = sensors[0] + sensors[1] + sensors[2] + sensors[3] + sensors[4];
  
  if(seats_available > 0){
    digitalWrite(led1,HIGH);
    digitalWrite(led2,HIGH);
  } else{
    digitalWrite(led1,LOW);
    digitalWrite(led2,LOW);
  }
  
  Serial.println(seats_available);
  
  delay(200);
}
Processing

Kode: Vælg alt

import processing.serial.*;
Serial myPort;  // Create object from Serial class
String seats;
boolean green, stroke, available, p1;

int x1 = 280;
int y1 = 230;
int x2 = 730;
int y2 = 225;
int x3 = 590;
int y3 = 345;

p_pladser object1 = new p_pladser();

PImage aarhus;
PImage gps;

void setup(){
  //something weird about the data transmission
  frameRate(5);
  size(1000,650);
  background(255);
  
  String portName = Serial.list()[2]; //change the 0 to a 1 or 2 etc. to match your port
  myPort = new Serial(this, portName, 9600); 
  
  aarhus = loadImage("bg.png");
  gps = loadImage("gps.jpg");
}

void draw(){
  background(255);
  
  imageMode(CENTER);
  gps.resize(800,500);
  image(gps,width/2,height/2);
  aarhus.resize(607,275);
  image(aarhus,width/2-6,height/2-65);
  
  if (myPort.available() > 0){
    seats = myPort.readStringUntil('\n');
    
    if(seats != null){
      println(float(seats));
      if(float(seats) > 0){
        stroke(79,237,0);
        green = true;
        available = true;
      } else{
        green = false;
        available = false;
        stroke(255,0,0);
      }
    }
    if(seats == null){
      println("No valid data, wait a second");
    }
  }
  
  
  rectMode(CENTER);
  object1.new_pplads(280,230,size);
  stroke(255,0,0);
  object1.new_pplads(730,225,size);
  object1.new_pplads(590,345,size);
  
  if(green){
    fill(79,237,0);
  } else{
    fill(255,0,0);
  }
  
  textAlign(CENTER);
  text("P",280,235);
  fill(255,0,0);
  text("P",730,230);
  text("P",590,350);
  
  rectMode(CORNER);
  textAlign(CORNER);
  
  if(mouseX > x1 - 15/2 && mouseX < x1 + 15/2 &&
     mouseY > y1 - 15/2 && mouseY < y1 + 15/2)
    {
      p1 = true;
      object1.menu(x1,y1);
    } else{
      p1 = false;
    }
    
  if(mouseX > x2 - 15/2 && mouseX < x2 + 15/2 &&
     mouseY > y2 - 15/2 && mouseY < y2 + 15/2)
    {
      object1.menu(x2,y2);
    }
    
  if(mouseX > x3 - 15/2 && mouseX < x3 + 15/2 &&
     mouseY > y3 - 15/2 && mouseY < y3 + 15/2)
    {
      object1.menu(x3,y3);
    }
    
  
}


//ny fane

int x, y, size;

class p_pladser{

  // constructor
  p_pladser(){
  }
  
  void new_pplads(int x, int y, int size){
    size = 15;
    fill(255);
    rect(x,y,size,size);
  }

  void menu(int x, int y){
    fill(255);
    stroke(0);
    rect(x,y,300,120);
    fill(0);
    if(available && p1){
      text("Der er ledige p-pladser tilgængelige.",x+25,y+25);
      text("Antal ledige p-pladser: " + seats,x+25,y+45);
    } else{
      text("Der er ingen ledige p-pladser i øjeblikket.",x+25,y+25);
    }
  }
    
}



Der er sikkert mange nybegynder-agtige programmerings"tricks", men jeg har lidt mistet overblikket pga. null-problemet, og det var tit, den ikke ville lade mig gøre noget, der var smartere, fordi programmet ellers ville crashe. Som I kan se har jeg måttet putte en del ind i tjekket om, at værdien ikke er null :|

cristian
Moderator
Moderator
Indlæg:882
Tilmeldt:26. sep 2011, 21:31
Kontakt:

Re: Nullpointerexception / NaN error

Indlæg af cristian » 7. mar 2015, 21:06

Josefine prøv at læse denne blog og se om den ikke kan hjælpe dig
http://playground.arduino.cc/Interfacing/Java

Josefine
Geni
Geni
Indlæg:308
Tilmeldt:9. dec 2011, 16:46

Re: Nullpointerexception / NaN error

Indlæg af Josefine » 11. mar 2015, 23:09

Hej igen. Beklager det sene svar, men jeg fik pludselig travlt og deadlinen kom for tæt på. Det hele virkede upåklageligt, da jeg skulle fremvise det, og faktisk var den endda rigtig hurtig til at reagere i forhold til før. Jeg tvivler faktisk på, at der overhovedet kom null-inputs til sidst, men det svingede meget på et tidspunkt.
Jeg vil nok ikke bruge mere tid på at rode rundt i det nu, da jeg ikke skal bruge programmet mere - men tak for hjælpen, og jeg vil klart kigge på linket :D Forhåbentlig bliver jeg bedre til at programmere i Arduino på næste år, hvor vi bliver undervist i det, og så finder jeg måske ud af, hvad årsagen kunne være :)

Besvar