Illogical Run-Time Logic Error -- Much Thanks!

Hi all, I believe I must be misunderstanding something about the Arduino on a deeper level. After many hours of troubleshooting, I have been unable to determine the issue. (Will post full code below).
To summarize, I am using an Arduino Uno to interface with an RFID reading device. The program starts by asking how many unique RFID tags will need to be recognized. It then loops, asking for a scanned tag followed by a name. It saves this information in string arrays. I would follow up with more programming but I have been stuck here after ages and ages of work.

The issue is that the first loop through DOES allow a user to swipe a tag and enter their name. By troubleshooting and testing I know that the data is stored correctly in this iteration. However, upon the second loop the while loop

   userIds[j] = "";
    //Serial.println(userIds[j]);
    //Serial.println("test");

    while(userIds[j] == "")
    {
      //Serial.print("Before function call: ");
      //Serial.print(userIds[j]);
      userIds[j] = getTagId();
      //Serial.print("After function call: ");
      //Serial.print(userIds[j]);
    }
    //ISSUE HERE: After 1st user entered, this while loop above only runs once, despite the restrictions. it then skips down to the next line despite userIds[1] being == "" so it should
    //keep looping. memory issue maybe? but even that doesnt make senes.

within initUsers() only runs once. This makes no sense according to my troubleshooting, since the string condition for the while loop is true. The called function getTagId() also only runs once, which again just makes no sense.

I know this is a lot of info to throw at you :drooling_face: but I would really appreciate some insight here. The problem is so illogical by the code that I must either be missing something painfully obvious (possible although I have been checking everything for hours like I said), OR there is something deeper I don't know about the Arduino. It almost seems like it runs out of memory...but that can't be the issue, or the getTagId() function would not have successfully stored the first tag data!

Again, thank you so much. I really love you. I am posting at 4AM because I am running out of time on this...unfortunately I had a lot of equipment quality/shipping issues and the due date (4/3/14 at 3PM CST) doesn't care :fearful:
If anyone can help me and lives in Columbia or St. Louis Missouri, I would love to buy you a coffee/beer/dinner/potted plant, whichever is your preference. XD My full code (quite long I know but I highlighted the seemingly relevant parts above) is posted in full below.

//
// RFID reader function testing
// based on http://arduino.cc/playground/Code/ID12
//

#include <SoftwareSerial.h>

const int readerToArduino = 2;
const int ArduinoToReader = 3;
const int pinLED = 7;
SoftwareSerial reader(readerToArduino, ArduinoToReader);


String users[10];
String userIds[10];
int numUsers = 0;
boolean firstRun = true;


void setup() {
  reader.begin(9600);
  Serial.begin(9600);
  pinMode(pinLED,OUTPUT);
}
int i;
void loop() 
{
  while(firstRun == true)
  {
    Serial.println("How many persons will be using an RFID key? (<=10)"); 
    while(numUsers == 0)
    {
      setupRFID();
    }
    Serial.println("");
    Serial.print("Number of users will be ");
    Serial.print(numUsers);


    initUsers();

    for(i = 0; i < numUsers; i++)
    {
      Serial.println(userIds[i]);
      Serial.println(users[i]); 
    }

    firstRun = false; 
  }


  //now for the stuff after the first initial run AKA comm. to Post
}

void initUsers()
{
  int j;
  for(j = 0; j < numUsers; j++)
  {

    Serial.println("");
    Serial.print("Scan RFID tag for user ");
    Serial.print(j+1);
    Serial.print(":");
    Serial.println("");



    userIds[j] = "";
    //Serial.println(userIds[j]);
    //Serial.println("test");

    while(userIds[j] == "")
    {
      //Serial.print("Before function call: ");
      //Serial.print(userIds[j]);
      userIds[j] = getTagId();
      //Serial.print("After function call: ");
      //Serial.print(userIds[j]);
    }
    //ISSUE HERE: After 1st user entered, this while loop above only runs once, despite the restrictions. it then skips down to the next line despite userIds[1] being == "" so it should
    //keep looping. memory issue maybe? but even that doesnt make sense.


    Serial.println("");
    Serial.print("Please enter the name of that user: ");

    users[j] = "";



    while(users[j] == "")
    {
      users[j] = getName(); 
      Serial.print(users[j]);
    }

  }



}

String getName()
{
  String name = "";
  char c;
  delay(10);

  while (Serial.available() > 0)
  {
    c = (char)Serial.read();
    if (c == '\n') 
    {
      name = "";  
    }
    else
    {  
      name = name + c; 
    }
  }

  return name;


}


void setupRFID()
{

  if(Serial.available() > 0)
  {
    numUsers = Serial.parseInt(); 
  }

  if(numUsers <= 0)
  {
    numUsers = 0; 
  }
}


String getTagId()
{
  alertUser();
  delay(10);
  byte i = 0;
  byte val = 0;
  byte code[6];
  byte checksum = 0;
  byte bytesread = 0;
  byte tempbyte = 0;

  if(reader.available() > 0) {
    alertUser();

    if((val = reader.read()) == 2) {                  // check for header 
      alertUser();
      bytesread = 0; 
      while (bytesread < 12) {                        // read 10 digit code + 2 digit checksum
        if( reader.available() > 0) { 
          val = reader.read();
          if((val == 0x0D)||(val == 0x0A)||(val == 0x03)||(val == 0x02)) { // if header or stop bytes before the 10 digit reading 
            break;                                    // stop reading
          }

          // Do Ascii/Hex conversion:
          if ((val >= '0') && (val <= '9')) {
            val = val - '0';
          } 
          else if ((val >= 'A') && (val <= 'F')) {
            val = 10 + val - 'A';
          }

          // Every two hex-digits, add byte to code:
          if (bytesread & 1 == 1) {
            // make some space for this hex-digit by
            // shifting the previous hex-digit with 4 bits to the left:
            code[bytesread >> 1] = (val | (tempbyte << 4));

            if (bytesread >> 1 != 5) {                // If we're at the checksum byte,
              checksum ^= code[bytesread >> 1];       // Calculate the checksum... (XOR)
            };
          } 
          else {
            tempbyte = val;                           // Store the first hex digit first...
          };

          bytesread++;                                // ready to read next digit
        } 
      } 

      // Output to Serial:

      /*   if (bytesread == 12) {                          // if 12 digit read is complete
       Serial.print("5-byte code: ");
       for (i=0; i<5; i++) {
       if (code[i] < 16) Serial.print("0");
       Serial.print(code[i], HEX);
       Serial.print(" ");
       }
       
       }*/

      bytesread = 0;

      //save ID as a string, print for testing, and return the string
      String aString ="";
      for(i=0;i<5;i++)
      {
        if(code[i]<16)aString=aString+'0';
        aString=aString+String(code[i],HEX);
      }
      Serial.println(aString);
      return aString;

    }

  }

}

void alertUser()
{
  digitalWrite(pinLED,HIGH);
  delay(200);  
  digitalWrite(pinLED,LOW);
  delay(200);  
  //digitalWrite(7,HIGH);
  //delay(500);  
  //digitalWrite(7,LOW);
}

You declare a String class inside an if-statement, inside a function, and that is the String you return.
Can you use a public/global String class for that ?
Why do you need a String class, would be a normal character array easier ?