Multiple Errors in Processing when Connecting to Arduino

I'm trying to get the heatCam example for the Sparkfun Grideye sensor up and running, but I'm getting stuck on the processing side. I'm getting two different errors seemingly randomly, but never both as they both stop the sketch.
Sometimes the output is:

[0] "COM3"
[1] "COM9"
[2] "COM22"
[3] "COM23"
[4] "COM35"
[5] "COM39"
[6] "COM40"
map(NaN, 20, 40, 240, 360) called, which returns NaN (not a number)
ArrayIndexOutOfBoundsException: 21

where the number 21 changes around seemingly randomly
This error highlights line 83:
temps[q] = map(float(splitString[q]), 20, 40, 240, 360);

Other times, though less often, the output is:

[0] "COM3"
[1] "COM9"
[2] "COM22"
[3] "COM23"
[4] "COM35"
[5] "COM39"
[6] "COM40"
NullPointerException

This error highlights line 77:
String splitString[] = splitTokens(myString, ",");

The processing sketch is the processing heatcam example provided by Sparkfun, with only the serial input port changed:

/*
  Visualizing the Panasonic Grid-EYE Sensor Data using Processing
  By: Nick Poole
  SparkFun Electronics
  Date: January 12th, 2018
  
  MIT License: Permission is hereby granted, free of charge, to any person obtaining a copy of this 
  software and associated documentation files (the "Software"), to deal in the Software without 
  restriction, including without limitation the rights to use, copy, modify, merge, publish, 
  distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the 
  Software is furnished to do so, subject to the following conditions:

  The above copyright notice and this permission notice shall be included in all copies or 
  substantial portions of the Software.

  THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING 
  BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND 
  NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, 
  DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 
  OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
  
  Feel like supporting our work? Buy a board from SparkFun!
  https://www.sparkfun.com/products/14568
  
  This example is intended as a companion sketch to the Arduino sketch found in the same folder.
  Once the accompanying code is running on your hardware, run this Processing sketch. 
  This Processing sketch will receive the comma separated values generated by the Arduino code and
  use them to generate a thermal image.
  
  Hardware Connections:
  Attach the Qwiic Shield to your Arduino/Photon/ESP32 or other
  Plug the sensor onto the shield
*/

import processing.serial.*;

String myString = null;
Serial myPort;  // The serial port

float[] temps =  {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0};

// The statements in the setup() function 
// execute once when the program begins
void setup() {
  size(400, 400);  // Size must be the first statement
  noStroke();
  frameRate(30);
  
  // Print a list of connected serial devices in the console
  printArray(Serial.list());
  // Depending on where your GridEYE falls on this list, you
  // may need to change Serial.list()[0] to a different number
  myPort = new Serial(this, Serial.list()[4], 115200);
  myPort.clear();
  // Throw out the first chunk in case we caught it in the 
  // middle of a frame
  myString = myPort.readStringUntil(13);
  myString = null;
  // change to HSB color mode, this will make it easier to color
  // code the temperature data
  colorMode(HSB, 360, 100, 100);
}

// The statements in draw() are executed until the 
// program is stopped. Each statement is executed in 
// sequence and after the last line is read, the first 
// line is executed again.
void draw() { 
  
  // When there is a sizeable amount of data on the serial port
  // read everything up to the first linefeed
  if(myPort.available() > 64){
  myString = myPort.readStringUntil(13);
  
  // generate an array of strings that contains each of the comma
  // separated values
  String splitString[] = splitTokens(myString, ",");
  
  // for each of the 64 values, map the temperatures between 20C and 40C
  // to the blue through red portion of the color space
  for(int q = 0; q < 64; q++){
   
    temps[q] = map(float(splitString[q]), 20, 40, 240, 360);
    
  }
  }
  
  
  // Prepare variables needed to draw our heatmap
  int x = 0;
  int y = 0;
  int i = 0;
  background(0);   // Clear the screen with a black background
  
  
  // each GridEYE pixel will be represented by a 50px square: 
  // because 50 x 8 = 400, we draw squares until our y location
  // is 400
  while(y < 400){
  
    
  // for each increment in the y direction, draw 8 boxes in the 
  // x direction, creating a 64 pixel matrix
  while(x < 400){
  // before drawing each pixel, set our paintcan color to the 
  // appropriate mapped color value
  fill(temps[i], 100, 100);
  rect(x,y,50,50);
  x = x + 50;
  i++;
  }
  
  y = y + 50;
  x = 0;
  }
  
  // Add a gaussian blur to the canvas in order to create a rough
  // visual interpolation between pixels.
  filter(BLUR,10);
}

The code running on the Arduino is the arduino heatcam example provided by sparkfun with nothing changed:

/*
  Visualizing the Panasonic Grid-EYE Sensor Data using Processing
  By: Nick Poole
  SparkFun Electronics
  Date: January 12th, 2018
  
  MIT License: Permission is hereby granted, free of charge, to any person obtaining a copy of this 
  software and associated documentation files (the "Software"), to deal in the Software without 
  restriction, including without limitation the rights to use, copy, modify, merge, publish, 
  distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the 
  Software is furnished to do so, subject to the following conditions:

  The above copyright notice and this permission notice shall be included in all copies or 
  substantial portions of the Software.

  THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING 
  BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND 
  NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, 
  DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 
  OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
  
  Feel like supporting our work? Buy a board from SparkFun!
  https://www.sparkfun.com/products/14568
  
  This example is intended as a companion sketch to the Processing sketch found in the same folder.
  Once this code is running on your hardware, open the accompanying Processing sketch and run it 
  as well. The Processing sketch will receive the comma separated values generated by this code and
  use them to generate a thermal image. If you don't have Processing, you can download it here:
  https://processing.org/
  
  Hardware Connections:
  Attach the Qwiic Shield to your Arduino/Photon/ESP32 or other
  Plug the sensor onto the shield
*/

#include <Wire.h>
#include <SparkFun_GridEYE_Arduino_Library.h>

GridEYE grideye;

void setup() {

  // Start your preferred I2C object 
  Wire.begin();
  // Library assumes "Wire" for I2C but you can pass something else with begin() if you like
  grideye.begin();
  // Pour a bowl of serial
  Serial.begin(115200);

}

void loop() {

  // Print the temperature value of each pixel in floating point degrees Celsius
  // separated by commas 
  for(unsigned char i = 0; i < 64; i++){
    Serial.print(grideye.getPixelTemperature(i));
    Serial.print(",");
  } 

  // End each frame with a linefeed
  Serial.println();

  // Give Processing time to chew
  delay(100);

}

I came across []this](https://forum.arduino.cc/index.php?topic=351828.0) forum page where someone seems to be having the same problem, but their solution (adding println()) didn't work for me. I've also come across a couple people having an issue with map returning NaN on perfectly good data, but again, I found no solutions there.
If it means anything, I'm running an Arduino Uno with the Qwiic shield and all the test programs strictly on Arduino (no processing involvment) are working, so I know my sensor is good.

My guess is you are not receiving the data you think you are; Meaning either the data is malformed, or you aren't receiving all of it.

Problem 1. (NAN problem), means you are parsing something that CANNOT be parsed as a float. This could be null, or it could be that the data you are receiving is malformed.

The second problem, your null pointer exception, is pretty obvious, I think - myString is null.

From https://www.processing.org/reference/libraries/serial/Serial_readStringUntil_.html:Returns null if it doesn't find what you're looking for.

This means that your end of data string (ascii 13, carriage return) is not found in the serial stream.

In your code, you'll need to protect against this condition by not parsing out data if it hasn't been fully transmitted yet.

When debugging this issues, it's a good idea to monitor what you're ACTUALLY being sent. Print your received data on the processing side; It should give you a good idea of what assumption being made about the data is incorrect.