Serial Event null pointer exception

Thanks a lot! I understand what you said, and I think I implemented some improvements. However, now I get nullpointerexceptions on the call to r(coordinates.size()-1);
Can I not use the method to draw in such a way?

Here is my current sketch:

import processing.serial.*;
import java.util.List;
import java.util.ArrayList;

String val;     // Data received from the serial port
Serial serialConnectionObject;
int serialChannelIndexInt;
float lat;
float lng;
int rectSizeX = 40 ;
int rectSizeY = 40;
float latcoord = 0;
float longcoord = 0;
boolean newData = false;
float xCoord, yCoord, oldxCoord, oldyCoord;
List<deltaXY> coordinates;
float x, y, traceX, traceY;
deltaXY dXY;
JSONObject json;

void setup()
{
  size(400,400);
  background(0);
  InitSerialConnectionVoid(0);
  String portName = Serial.list()[serialChannelIndexInt]; //change the 0 to a 1 or 2 etc. to match your port
  println(portName);
  serialConnectionObject.bufferUntil('\n');
  x = 0.5 * width;
  y = 0.5 * height;
  dXY = new deltaXY();
  noLoop();
}

void draw()
{   try {
        json = parseJSONObject(val);
    }
    catch(Exception e) {
      e.printStackTrace();
    }
    if (json == null) {
        newData = false;
      } else {
        println(json.toString());
        lat = json.getFloat("lat");
        lng = json.getFloat("lng");
        println(lat);
        oldxCoord = xCoord;
        oldyCoord = yCoord;
        LatLngtoXY(lat,lng);
        dXY.setDX(xCoord, oldxCoord);
        dXY.setDY(yCoord, oldyCoord);
        try {
        coordinates.add(dXY);
        }
        catch(Exception e) {
          e.printStackTrace();
        }
        fill(#FFFFFF, 10);
        noStroke();
        rectMode(CENTER);
        r(coordinates.size()-1);
        if (coordinates.size() >=100) {
              coordinates.remove(0);
        }
        //newData=true;
      }

}



void serialEvent(Serial p) {
  try {
    println("test");
     val = p.readString();
     println(val);
     if(val != null) {
      redraw();
     }
  }
      
   catch(RuntimeException e) {
     e.printStackTrace(); 
  }
    
}

void r(int i) {
  if (i==0) {
    fill(#FFFFFF, 10);
    noStroke();
    rectMode(CENTER);
    rect(x, y, rectSizeX, rectSizeY);
  } else {
    float dx = coordinates.get(i).getDX();
    float dy = coordinates.get(i).getDY();
    traceX += dx;
    traceY += dy;
    fill(#FFFFFF, 50);
    noStroke();
    //rectMode(CENTER);
    rect(x+traceX, y+traceY, rectSizeX, rectSizeY);  
    println(traceX,traceY);
    r(i-1);
  }
}

void LatLngtoXY(float lat, float lon) {
    float mapWidth    = width;
    float mapHeight   = height;
    
    // get x value
    xCoord = (lon+180)*(mapWidth/360);
    
    // convert from degrees to radians
    float latRad = lat*PI/180;
    // get y value
    float mercN = log(tan((PI/4)+(latRad/2)));
    yCoord     = (mapHeight/2)-(mapWidth*mercN/(2*PI));
}

void InitSerialConnectionVoid(int _serialChannelIndexInt){
 
    serialChannelIndexInt = _serialChannelIndexInt;
 
    if(serialChannelIndexInt == Serial.list().length){ return; }
    try{
 
        serialConnectionObject = new Serial(this, Serial.list()[serialChannelIndexInt], 115200);
        serialConnectionObject.bufferUntil('\n');
 
    }
    catch (RuntimeException e){
 
        serialConnectionObject = null;
        println(e);
        println("SERIAL CONNECTION FAILED");
        InitSerialConnectionVoid(serialChannelIndexInt + 1);
 
    }
 
}

class deltaXY {
  float dx;
  float dy;

  deltaXY() {
  }

  public void setDX(float xCoord, float oldxCoord) {
    this.dx = xCoord-oldxCoord;
  }  
  public void setDY(float yCoord, float oldyCoord) {
    this.dy = yCoord-oldyCoord;
  }  
  public float getDX() {
    return this.dx;
  }  
  public float getDY() {
    return this.dy;
  }
}