Java - NullPointerException in a method
===

I'm writing a program that could manage universitary students with courses and subjects. The problem of the class I'm showing you is that when the method 

*public CorsoStudi(String unNomeCorso, ArrayList<Materia> unElencoMaterie, int unIdCorso)*
 
is called it throws a NullPointerException at line *elencoEsamiDati.add(q);*. So, probably the problem is with this line and the line after this: 

*EsameDato q = new EsameDato(unElencoMaterie.get(contatore), 0);*

Eclipse doesn't advice error on writing code.

**Creatore.java**
    
    import java.util.ArrayList;
    import java.util.Scanner;

    public class Creatore {

	int counterStudenti = 0;
	int counterMaterie = 0;
	int counterCorsi = 0;
	//int counterEsami = 0;
	ArrayList<Studente> listaStudenti = new ArrayList<Studente>();
	ArrayList<Materia> listaMaterie = new ArrayList<Materia>();
	ArrayList<CorsoStudi> listaCorsi = new ArrayList<CorsoStudi>();
	//ArrayList<EsameDato> listaEsami = new ArrayList<EsameDato>();
	
		
	public void iscriviStudente(String nomeStudente, String cognomeStudente, CorsoStudi corsoStudente){
		listaStudenti.add(new Studente(nomeStudente, cognomeStudente, counterStudenti, corsoStudente));
		counterStudenti++;
	}
	
	public void reimmatricolaStudente(int unaMatricola, int unIdCorso){
		int c = 0;
		CorsoStudi unCorso = null;
		for(c = 0; c < listaCorsi.size(); c++){
			if(listaCorsi.get(c).getIdCorso() == unIdCorso)
				unCorso = listaCorsi.get(c);
		}
		int contatore = 0;
		for(contatore = 0; contatore < listaStudenti.size(); contatore++)
			if(listaStudenti.get(contatore).getMatricola() == unaMatricola){
				iscriviStudente(listaStudenti.get(contatore).getNome(), listaStudenti.get(contatore).getCognome(), unCorso);
				rimuoviStudente(unaMatricola);
			};
	}
	
	public void rimuoviStudente(int matricola){
		int contatore;
		for(contatore = 0; contatore < listaStudenti.size(); contatore++){
			if(listaStudenti.get(contatore).getMatricola() == matricola)
				listaStudenti.remove(contatore);
		}
	}
	
	public Materia creaMateria(String nomeMateria, int crediti){
		listaMaterie.add(new Materia( nomeMateria, crediti, counterMaterie));
		counterMaterie++;
		return listaMaterie.get(counterMaterie - 1);
	}
	
	public void creaCorsoStudi(String nomeCorso, ArrayList<Materia> materieCorso){
		CorsoStudi q = new CorsoStudi( nomeCorso, materieCorso, counterCorsi);
		listaCorsi.add(q);
		counterCorsi++;
	}
	
	public ArrayList<Studente> cercaStudente(int opzione, String pattern){
		int contatore = 0;
		ArrayList<Studente> listaRicercati = new ArrayList<Studente>();
		//opzione 1 = ricerca per nome
		if(opzione == 1)
			for(contatore = 0; contatore < listaStudenti.size(); contatore++){
				if(listaStudenti.get(contatore).getNome().equalsIgnoreCase(pattern))
					listaRicercati.add(listaStudenti.get(contatore));
			};
		//opzione 2 = ricerca per cognome
		if(opzione == 2)
			for(contatore = 0; contatore < listaStudenti.size(); contatore++){
				if(listaStudenti.get(contatore).getCognome().equalsIgnoreCase(pattern))
					listaRicercati.add(listaStudenti.get(contatore));
		};
		//opzione 3 = ricerca per matricola
		if(opzione == 3)
			for(contatore = 0; contatore < listaStudenti.size(); contatore++){
				if(listaStudenti.get(contatore).getMatricola() == Integer.parseInt(pattern))
					listaRicercati.add(listaStudenti.get(contatore));
		};
		//opzione 4 = ricerca per corsoStudi
		if(opzione == 4)
			for(contatore = 0; contatore < listaStudenti.size(); contatore++){
				if(listaStudenti.get(contatore).getCorsoStudi().getIdCorso() == Integer.parseInt(pattern))
					listaRicercati.add(listaStudenti.get(contatore));
		};
			
		return listaRicercati;
	}
	
	public Materia materiaDaId(int id){
		int c = 0;
		Materia materiaDaRitornare = null;
		for(c = 0; c < listaMaterie.size(); c++){
			if(listaMaterie.get(c).getIdMateria() == id)
				materiaDaRitornare = listaMaterie.get(c);
		}
		return materiaDaRitornare;
	}
    }

**CorsoStudi.java**
    
    import java.util.ArrayList;
    import java.util.Scanner;

    public class CorsoStudi {

	private String nomeCorso;
	private int idCorso;
	private ArrayList<Materia> elencoMaterie;
	private ArrayList<EsameDato> elencoEsamiDati;
	
	public CorsoStudi(String unNomeCorso, ArrayList<Materia> unElencoMaterie, int unIdCorso){
		nomeCorso = unNomeCorso;
		elencoMaterie = unElencoMaterie;
		idCorso = unIdCorso;
		int contatore = 0;
		//EsameDato q = null;
		for(contatore = 0; contatore < unElencoMaterie.size(); contatore++){
			EsameDato q = new EsameDato(unElencoMaterie.get(contatore), 0);
			elencoEsamiDati.add(q);
		};
	}
	
	public String getNomeCorso(){
		return nomeCorso;
	}
	
	public int getIdCorso(){
		return idCorso;
	}
	
	public ArrayList<Materia> getElencoMaterie(){
		return elencoMaterie;
	}
	
	public ArrayList<EsameDato> getElencoEsamiDati(){
		return elencoEsamiDati;
	}
	
	public String toString(){
		String s = "";
		s = s + "Ecco le materie di questo Corso di Studi:\n";
		int c = 0;
		for(c= 0; c < elencoMaterie.size(); c++){
			s = s + elencoMaterie.get(c).getIdMateria() + " "; 
			s = s + elencoMaterie.get(c).getNomeMateria() + " (";
			s = s + elencoMaterie.get(c).getCrediti() + " crediti)\n";
		}
		return s;
	}
    }

