Il problema è dovuto all'uso di nextInt() nei cicli in cui leggi i valori dei voti.
Scanner funziona a “token”. Lui prende la stringa e la tokenizza in base a dei delimitatori, poi in base al metodo richiamato (nextInt(), nextDouble(), ecc) ritorna il primo token che matcha la richiesta consumando tutto l'input che c'era prima, ma lasciando nel buffer tutto ciò che viene dopo.
Quando tu scrivi dell'input da tastiera, termini l'inserimento premendo INVIO. L'INVIO corrisponde al carattere “\n” (su Windows, alla coppia di caratteri “\r\n”). Quindi, quando tu digiti, ad esempio, il nome dello studente (supponiamo “Mario”), nel buffer arriva questa sequenza:
M a r i o \n
Come vedi c'è quel “\n” alla fine. Il metodo readLine() consuma tutto l'input fino ad un delimitatore di riga ("\n" e “\r” sono dei delimitatori di riga). Quindi dopo aver restituito il nome dello studente, Scanner rimuove dal buffer tutto quello che c'era prima del delimitatore di riga e anche il delimitatore stesso per prepararsi a leggere il resto.
Quando tu usi nextInt() accade qualcosa di “diverso”: nextInt() recupera il primo token intero delimitato da un whitespace, ma lascia il delimitatore finale nel buffer. Quindi, quando tu dai in pasto al tuo programma il voto (ad esempio 8), nel buffer arriva:
8 \n
nextInt() prende il valore 8, lo restituisce come intero e lasca nel buffer il “\n”.
Poi vai ad indicare il secondo voto, ad esempio, 6 e nel buffer Scanner si ritrova con questo:
\n 6 \n
Lui restituisce il 6, consuma (cioè elimina) tutto ciò che c'era prima e lascia, di nuovo, il “\n”.
Avanti così, fino al prossimo studente: qui chiedi il nome e usi nextLine(). Nel buffer, c'è il “\n” dell'ultimo voto inserito. Per nextLine() tanto basta. Restituisce una bella stringa vuota, consuma il “\n” e si va oltre.
Come si risolve? Semplice: dopo ciascuna lettura dei voti, ovvero dopo ogni nextInt(), metti un nextLine() “a vuoto” in modo da consumare il “\n” residuo:
for (int i=0; i<3; i++) {
System.out.println("Inserisci voto "+ (i+1) +":");
stdA.voti[i] = tastiera.nextInt();
tastiera.nextLine(); // un nextLine() a vuoto per consumare il "\n"
}
Prova.