Salve a tutti, sto implementando una classe che si chiama Libretti. La traccia è questa:

gli studenti hanno un libretto per il primo semestre e un libretto per il secondo semestre,
sui libretti vanno scritti il nome degli insegnamenti sostenuti, le date(gg/mm/aaaa) degli esami,il voto e i CFU.

Creare quindi un menù per la scelta tra:

1)Inserimento dei dati per il popolamento dei libretti da input.

2)Ordinamento (a scelta) in base al nome dell'insegnamento per ogni libretto.

3)Fusione dei due libretti in un unico libretto annuale(attraverso il metodo merge(NON MERGESORT)e stampa del libretto annuale.

Ps:Stampa dei libretti sia dopo l'acquisizione dei dati sia dopo l'ordinamento.
Questa è la classe:

codice:
public class Libretto {

	/**
	 * gli studenti hanno un libretto per il primo semestre 
	 * e un libretto per il secondo semestre. 
	 * sui libretti vanno scritti il nome degli insegnamenti
	 * sostenuti, le date(gg/mm/aaaa) degli esami,il voto 
	 * e i CFU.
	 */
	
	//Costruttore oggetti della classe
	public Libretto(String mater, String date, int mark, int CFU)
	{
		materia=mater;
		data=date;
		voto=mark;
		cfu=CFU;
	}
	
	public String getSub()
	{
		return materia;
	}
	public void setSub(String v)
	{
		materia=v;
	}
	//___________________________________
	public String getData()
	{
		return data;
	}
	public void setData(String v)
	{
		data=v;
	}
	//________________________________
	public int getVoto()
	{
		return voto;
	}
	public void setVoto(int v)
	{
		voto =v;
	}
	//______________________________
	public int getCfu()
	{
		return cfu;
	}
	public void setCfu(int v)
	{
		cfu =v;
	}
	//________________________________
	
	//metodo ordinamento per materia
	//(INSERTION SORT)
	
	public static void ordSub(Libretto[] v)
	{
		Libretto temp;
		for (int i=1; i<v.length;i++)
		{
			for(int j=i;j>0;j--)
			{
				if((v[j].materia).compareToIgnoreCase(v[j-1].materia)<0)
				{
					temp=v[j];
					v[j]=v[j-1];
					v[j-1]=temp;
				}
			}
		}
	}
	
	//___________________________________
	//Metodo che stampa
	public static void stampa(Libretto[] array)
	{
		for(int i=0;i<array.length;i++)
		{
			System.out.println(array[i].materia+", "+array[i].data+", "
					+array[i].voto+", "+array[i].cfu);
		}
	}
	//____________________________________
	//Fusione dei due libretti in un unico libretto annuale
	//(prima primo semestre, poi secondo semestre)
	public static void merge(Libretto[]v1, Libretto[]v2, Libretto[]nuovo)
	{
		nuovo = new Libretto[v1.length+v2.length];
		System.arraycopy(v1, 0, nuovo, 0, v1.length);
		System.arraycopy(v2, 0, nuovo, v1.length, v2.length);
	}

	
//campi esemplare
	private String materia;
	private String data;
	private int voto;
	private int cfu;

}
E questo il codice del tester:

codice:
import java.util.Scanner;


public class Libretto_tester {

	public static void main(String[] args) {
		// TODO Auto-generated method stub
		
		int scelta;
		Libretto[] lib1 = new Libretto[3];
		Libretto[] lib2 = new Libretto[4];
		Scanner in=new Scanner(System.in);
do
	{
		//MENU PER LA SCELTA DELLE AZIONI
		
		System.out.println("Scegli tra le seguenti azioni: "
				+"\n[1]Inserimento dei dati per il popolamento dei libretti da input."
				+"\n[2]Ordinamento in base al nome dell'insegnamento per ogni libretto."
				+"\n[3]Fusione dei due libretti in un unico libretto annuale");
		
		scelta = in.nextInt();
		
	switch(scelta)
	{
		case 1: 
			lib1 = new Libretto[3];
			//___________________________
			System.out.println("PRIMO LIBRETTO: ");
			for (int i=0;i<lib1.length;i++){
			System.out.println("Inserire Materia "+(i+1)+": ");
			String materia = in.nextLine();
			System.out.println("Inserire Data "+(i+1)+": ");
			String data = in.nextLine();
			System.out.println("Inserire Voto "+(i+1)+": ");
			int voto = in.nextInt();
			System.out.println("Inserire CFU "+(i+1)+": ");
			int cfu = in.nextInt();
			//immetto nell'oggetto materia 1 i dati acquisiti
			Libretto sub = new Libretto(materia,data,voto,cfu);
			lib1[i]=sub;
			}//fine del for
			//__________________________________________
			lib2 = new Libretto[4];
			//___________________________
			System.out.println("SECONDO LIBRETTO: ");
			for (int i=0;i<lib2.length;i++){
			System.out.println("Inserire Materia "+(i+1)+": ");
			String materia = in.nextLine();
			System.out.println("Inserire Data "+(i+1)+": ");
			String data = in.nextLine();
			System.out.println("Inserire Voto "+(i+1)+": ");
			int voto = in.nextInt();
			System.out.println("Inserire CFU "+(i+1)+": ");
			int cfu = in.nextInt();
			//immetto nell'oggetto materia 1 i dati acquisiti
			Libretto sub = new Libretto(materia,data,voto,cfu);
			lib2[i]=sub;
			}//fine del for
			
			//STAMPA (PRIMA DELL'ORDINAMENTO
			System.out.println("__Libretto primo semestre:__ ");
			Libretto.stampa(lib1);
			System.out.println("__Libretto secondo semestre:__ ");
			Libretto.stampa(lib2);
			break;
			
		case 2:
			Libretto.ordSub(lib1);
			System.out.println("LIBRETTO PRIMO SEMESTRE ORDINATO PER MATERIA: ");
			Libretto.stampa(lib1);
			
			Libretto.ordSub(lib2);
			System.out.println("LIBRETTO SECONDO SEMESTRE ORDINATO PER MATERIA: ");
			Libretto.stampa(lib2);
			break;
			
		case 3:
			System.out.println("FUSIONE DEI DUE LIBRETTI: ");
			Libretto[] annuale = new Libretto[7];
			Libretto.merge(lib1, lib2, annuale);
			Libretto.stampa(annuale);
			
	
	}
	}while(scelta!=4);
	
	System.out.println("Programma terminato!");	
		

		

	}

}
Il mio problema è questo:appena lancio il programma e inserisco la scelta 1, il computer mi chiede contemporaneamente Materia 1 e data 1, con la possibilità di scrivere una sola cosa. Appena premo invio poi mi chiede voto 1 separatamente e infine cfu 1.
Come posso risolvere?

__________________________________________________ ________
EDIT: P.s. se può essere utile, ho notato che il problema non è nella nextLine :/ Ho provato a cambiare l'ordine degli input ma a prescindere da questo, mi chiede sempre le prime due insieme. Anche voto 1 e data 1, per esempio. Io ho eseguito tutto il case, ed effettivamente l'array lo riempie, ma ovviamente lascia vuoto il campo della prima scelta, perchè giustamente non lo si riesce a riempire.

__________________________________________________ __________
EDIT2: Scusate per il doppio edit, ma nel frattempo continuavo a provare. Dovrei aver risolto. Ho usato in.next() invece di nextLine per le stringhe..e a desso sembra funzionare. Ma qualcuno mi spiega come mai? E' la prima volta che ho problemi di quest genere :/