Il problema è che quando la condizione per la quale bisognerebbe eliminare l'oggetto dalla lista, l'oggetto viene rimosso ma al ciclo successivo mi viene "sputata" una bella eccezione.
non dovresti eliminare un oggetto presente nella collezione che stai iterando col metodo .remove() della collection, a meno che tu non esca immediatamente dopo dal ciclo (cosa che mi sembra tu faccia con "break"... invece non ho capito quando ricicli nuovamente la collezione). Usa il metodo .remove() di Iterator:
codice:
Iterator it=bonusTokenList.iterator();
                while (it.hasNext())
                {
                    BonusToken bt=(BonusToken)it.next();
                    if (bt.getBonusGotDate()==null) {
                        it.remove();
                        break;
                    }
                }