Si tratta della "solita", conosciutissima e noiosissima questione del "mix" di nextString() (fatto dopo) con uno degli altri nextXyz() (es. nextInt, nextLong, ecc...).
La questione è che se ad un nextInt() si scrive 123<invio> il nextInt() "consuma" solo il token 123 ma il <invio> resta da consumare. E uno "sfortunato" nextString() successivo si trova praticamente un newline di botto cioè riga "vuota".
Non è un "baco" o errore di Scanner ... semplicemente quello è il suo funzionamento per design.
Soluzione giusta e valida, specialmente se si vuole fare un piccolo strato di astrazione "sopra" Scanner, facendosi dei metodi che nascondono questi dettagli.
Sì, dopo il nextInt() basta fare sullo scanner un skip("\\s+") che "salta" uno o più whitespace (newline compreso).