Exception in thread "main" java.lang.NullPointerException

Estou fazendo um exercício de um curso que diz que preciso fazer um código para calcular a média de nota de uma turma de alunos. A turma é formado de 03 alunos cujo cada qual tem duas provas formadas de duas notas. É necessário criar três classes: Turma, Aluno e Prova.
Quis deixar meu código bem genérico sem hardcode e portanto pesquisei sobre array e passagem de parâmetros. Apesar de meu código compilar corretamente dá a seguinte mensagem ao executar:

Exception in thread "main" java.lang.NullPointerException

O código até o presente momento é:

  • Prova

public class Prova { 	
   	double[] nota = new double[2];
    	
    	private double notaFinal   = 0;
    	private int    contadorAux = 0;
    	
    	public double calcularNotaTotal () {
    		for (; contadorAux < nota.length; contadorAux ++) {
    			notaFinal += nota[contadorAux];
    			System.out.println(notaFinal);
    		}
    		return notaFinal / contadorAux;
    	}    	
}
  • Aluno

public class Aluno {
	
	public Prova[] prova = new Prova[2];
	
	private int    contadorAux = 0;
	private double media       = 0;
	
	public double calcularMedia() {
		
		for (;contadorAux < prova.length; contadorAux++) {
			media += prova[contadorAux].calcularNotaTotal();
		}
		
		return media / contadorAux;
	}
	
}
  • Turma

public class Turma {
	
	public Aluno aluno[] = new Aluno[3];

	private int    contadorAux = 0;
	private double media       = 0;
	
	public double calcularMedia () {
		
		for (; contadorAux < aluno.length; contadorAux++) {
			media += aluno[contadorAux].calcularMedia();
		}
		
		return media / contadorAux;
	}    	
}

E por fim, a classe Aplicação que contém o main(String[] args):

import java.util.Scanner;

public class Aplicacao {

	public static void main(String[] args) {
		// TODO Auto-generated method stub
		
		Turma   turma = new Turma();
		Scanner entrada = new Scanner(System.in);
		String aux;
		
		double[] teste = new double[2];
		
		int contadorTurma = 0;
		
		for (; contadorTurma < 1; contadorTurma++) {
			for (int contadorAluno = 0; contadorAluno < 1; contadorAluno++) {
				
				for (int contadorProva = 0; contadorProva < 2; contadorProva++) {
			
					for (int contadorNota = 0; contadorNota < 2; contadorNota++) {
						//System.out.print("Informe a nota " + contadorNota + " da prova " + contadorProva + " do aluno " + contadorAluno + ": ");
						//aux = entrada.nextLine();
						//turma[contadorTurma].aluno[contadorAluno].prova[contadorProva].nota[contadorNota] = 1.0; //Double.parseDouble(aux);
					}
				}			
			}
		}
		
		turma.aluno[0].prova[0].nota[0] = 1.0;
		teste[0] = 5.0;
		
		//System.out.println();
		
		System.out.println("Fim");
		//System.out.println("A média da turma é: " + turma[contadorTurma].calcularMedia());
	}
}

Tentei procurar em alguns fóruns para resolver isso, mas até agora não consegui. Alguém tem uma ideia do que estou errando?

Outro ponto que fiquei me perguntando é como usar os métodos getters e setters aonde quero atribuir um valor a um atributo que está

no terceiro nível.

Aplicação --> Classe Turma --> Classe Aluno --> Classe Prova

Bom dia Arthur,
tudo bem?

A exception (erro) que você está recebendo, indica que ao executar sua aplicação, ela está tentando acessar alguma variável (posição na memória) que deveria ter uma referência para algum objeto, mas não tem. Pelo que consegui entender do seu código…rsrss… você criou muitos Arrays do tipo primitivo, mas eu não consegui identificar um Array de Turma. Em uma parte do código, você faz a seguinte chamada:

  • turma.aluno[0].

Em outra, para acessar a mesma variável você faz uma chamada diferente:

  • turma[contadorTurma].

Tente retirar os colchetes + variável e tente acessar como na primeira chamada acima. O que acontece?

Agora uma dica:
Existem muitas linhas de códigos repetidas na sua modelagem de classe, como por exemplo o "contadorAux. Você poderia utilizar diretamente o valor das iterações (ou seja, do for) para acessar os dados em seu objeto.
Também há muitos loops aninhados.
Separe a inclusão dos valores: primeiro a nota do aluno, depois a media dele e por último a média da classe.

Abraço.

Agradeço pela dica @thimfont. Acabei fazendo o exercício do modo proposto pelo professor…rsrs…ainda não cheguei na aula do vetor.

Obrigado pela força.