initialisierung und sofortig bedingtes überschreiben würde ich als bad practice einstufen...
die null checks überall sind nicht schön, es macht vielleicht eher sinn am anfang einmal zu prüfen ob ein Eintrag vorhanden ist und wenn nicht ne leere Liste zu initialisieren..
hier wird ganz oft this.replyMapping.get(sender) verwendet, rausziehen in eine eigene variable z.B. replyMap = this.replyMapping.get(sender)
mein Vorschlag hier wäre du throwst nach dem custom fehler einfach nochmal die exception throw e und packst in die Objects.requireNonNull das angefragte rein. Dann ist alles immer ersichtlich.
sollte private sein, wenn grantAdvancement entscheidet ob es pending ist oder nicht
die Fehlermeldung kann irreführend sein. Es sollte zumindest im Fehler ersichtlich sein welches advancement fehlt.