Ajuda com NullPointerException em Java

Oi galera, sou iniciante em Java e estou fazendo um trabalho pra faculdade…
só que está dando esse erro:

Exception in thread "main" java.lang.NullPointerException
at Estacionamento.setup(Estacionamento.java:88)
at TesteEstacionamento.main(TesteEstacionamento.java:25)

Alguém pode me ajudar com isso? já tentei mil coisas e continua dando erro…por isso não consegui nem testar o restante do programa e preciso entregar no máximo sábado.

As classes que estou usando são :
1 -

public class Estacionamento {
	String nome;
	String endereco;
	double largura;
	double profundidade;
	Vaga novasVagas[];
	
	public Estacionamento(){
		
	}
	
	public Estacionamento(String nome, String endereco, double largura, double profundidade){
		this.nome = nome;
		this.endereco = endereco;
		this.largura = largura;
		this.profundidade = profundidade;
		
	}

	public String getNome() {
		return nome;
	}

	public void setNome(String nome) {
		this.nome = nome;
	}

	public String getEndereco() {
		return endereco;
	}

	public void setEndereco(String endereco) {
		this.endereco = endereco;
	}

	public double getLargura() {
		return largura;
	}

	public void setLargura(double largura) {
		this.largura = largura;
	}

	public double getProfundidade() {
		return profundidade;
	}

	public void setProfundidade(double profundidade) {
		this.profundidade = profundidade;
	}
	
	public double getAreaUtil(){
		// área do terreno ocupada pelo estacionamento
		
		return (this.getLargura() * this.getProfundidade());
	
	}
	
	public double getAreaOcupadaPorVagas(){
		//soma da área de todas as vagas
		double soma = 0;
		for(int i = 0; i < novasVagas.length; i++)
			soma = soma + novasVagas[i].getAreaUtil(); 
		return soma;
	}
	
	public double getAreaCirculacaoEToaletes(){
		
		return  (this.getAreaUtil() - this.getAreaOcupadaPorVagas());
	}
	
	public Vaga procurarVaga(String linha, int coluna){
		
		for(int i = 0; i < novasVagas.length; i++){
			if((novasVagas[i].getLetra() == linha) && (novasVagas[i].getNumero() == coluna))
				return novasVagas[i];
		}
		return null;
	}
	
	public void setup(int linhasNormais, int linhasEspeciais){
		
		novasVagas = new Vaga[(linhasEspeciais * ValoresConstantes.MAX_VAGAS_ESPECIAIS_POR_LINHA) + (linhasNormais * ValoresConstantes.MAX_VAGAS_NORMAIS_POR_LINHA)]; 
						
		for(int i = 0; i < ValoresConstantes.MAX_VAGAS_ESPECIAIS_POR_LINHA; i++){
			
				this.novasVagas[i].setLetra(ValoresConstantes.alfabeto[0]);
				this.novasVagas[i].setNumero(i + 1);
				this.novasVagas[i].setLargura(ValoresConstantes.LARGURA_VAGAS_ESPECIAIS);
				this.novasVagas[i].setProfundidade(ValoresConstantes.ALTURA_VAGAS);
		}
	
		for(int i = ValoresConstantes.MAX_VAGAS_ESPECIAIS_POR_LINHA; 
			i < ((linhasNormais * ValoresConstantes.MAX_VAGAS_NORMAIS_POR_LINHA)
			+ (linhasEspeciais * ValoresConstantes.MAX_VAGAS_ESPECIAIS_POR_LINHA)); i++){				
				novasVagas[i].setLargura(ValoresConstantes.LARGURA_VAGAS_NORMAIS);
				novasVagas[i].setProfundidade(ValoresConstantes.ALTURA_VAGAS);
		}
		
		for(int i = ValoresConstantes.MAX_VAGAS_ESPECIAIS_POR_LINHA; 
			i < ((linhasNormais * ValoresConstantes.MAX_VAGAS_NORMAIS_POR_LINHA) + 
		 	(linhasEspeciais * ValoresConstantes.MAX_VAGAS_ESPECIAIS_POR_LINHA)); i++){
		
				for(int j = 0; j < ValoresConstantes.MAX_VAGAS_NORMAIS_POR_LINHA; j++){
					novasVagas[j].setNumero(i + 1);
					novasVagas[j].setLetra(ValoresConstantes.alfabeto[i]);
				}
		}
	}

	public String toString(){
		String msg = "";
		
		for(int i = 0; i < novasVagas.length; i++){
			if(novasVagas[i].getNumero() == 1){
				msg = msg + "\n";
			}
			
			msg = msg + "Linha " + ValoresConstantes.alfabeto[i] + ":  | " + 
			novasVagas[i].getTipo() + " " + novasVagas[i].getLetra() + novasVagas[i].getNumero() + "| ";
			
		}
		return msg;
	}	
}

2 -

public final class ValoresConstantes {

	public static final int MAX_VAGAS_NORMAIS_POR_LINHA = 10;
	public static final int MAX_VAGAS_ESPECIAIS_POR_LINHA = 8;
	public static final double LARGURA_VAGAS_ESPECIAIS = 2.0;
	public static final double LARGURA_VAGAS_NORMAIS = 2.51;
	public static final double ALTURA_VAGAS = 4.0;
	public static final String[] alfabeto = {"A", "B", "C", "D", "E", "F", "G", "H", "I", "J", "K", "L", "M", "N", "O", "P", "Q", "R", "S", "T", "U", "V", "W", "X", "Y", "Z" };

	
	
}

3 -

import java.util.Scanner;

public class TesteEstacionamento {

	public static void main(String args[]){
		String nome = "";
		String endereco = "";
		String buscaLetra = "";
		int buscaNumero = 0;
		
		
		
		Scanner input = new Scanner(System.in);
		
		System.out.printf("Entre com o nome do Estacionamento:");
		nome = input.next();
		
		System.out.printf("Entre com o endereço do Estacionamento:");
		endereco = input.next();
		
		//TesteEstacionamento meuEstacionamento = new TesteEstacionamento();
		Estacionamento novoEstacionamento = new Estacionamento(nome, endereco, 23, 33);
		
		
		novoEstacionamento.setup(5, 1);
		
		System.out.printf("O nome do Estacionamento é: %s\n", novoEstacionamento.getNome());
		System.out.printf("Endereço: %s\n", novoEstacionamento.getEndereco());
		System.out.printf("Área útil: %f\n", novoEstacionamento.getAreaUtil());
		System.out.printf("Área ocupada pelas vagas: %f\n", novoEstacionamento.getAreaOcupadaPorVagas());
		System.out.printf("Área total de circulação e toaletes: %f\n", novoEstacionamento.getAreaCirculacaoEToaletes());
		
		System.out.printf("Quer buscar por uma vaga especifica? entre com a letra da vaga:\n");
		buscaLetra = input.next();
		System.out.printf("Agora entre com o número da vaga a ser buscada:\n");
		buscaNumero = input.nextInt();
		
		if(novoEstacionamento.procurarVaga(buscaLetra, buscaNumero) == null){
			System.out.printf("\n.:: Vaga não foi encontrada ::.\n");
		}
		else{
			novoEstacionamento.procurarVaga(buscaLetra, buscaNumero);
		}
	}
}

4 -

public class Vaga {
	String letra;
	int numero;
	double largura, profundidade;	
	char tipo;
	
	// construtor vazio sem parâmetro algum....
	// apenas pq pede no exercício - não causa erro
	public Vaga(){
		this.setTipo();
	}
	
	// construtor que inicializa todas os atributos da classe vaga
	public Vaga(String letra, int numero, double largura, double profundidade){
		this.letra = letra;
		this.numero = numero;
		this.largura = largura;
		this.profundidade = profundidade;
		
		// o atributo tipo tem de ser inicializado pela sobrecarga do método setTipo
		// existem dois setTipo, um que inicializa o tipo de acordo com a getAreaUtil
		// e outro que inicializa para os demais casos
		this.setTipo();
	}

	// getters e setters de todos os atributos
	public String getLetra() {
		return letra;
	}

	public void setLetra(String letra) {
		this.letra = letra;
	}

	public int getNumero() {
		return numero;
	}

	public void setNumero(int numero) {
		this.numero = numero;
	}

	public double getLargura() {
		return largura;
	}

	public void setLargura(double largura) {
		this.largura = largura;
	}

	public double getProfundidade() {
		return profundidade;
	}

	public void setProfundidade(double profundidade) {
		this.profundidade = profundidade;
	}

	public char getTipo() {
		return tipo;
	}

	// primeiro método setTipo - o outro está logo abaixo
	// configura a variável de acordo com um parâmetro char tipo
	public void setTipo(char tipo) {
		this.tipo = tipo;
	}
	
	// o segundo método setTipo - inicializa de acordo com o método getAreaUtil() 
	// que retorna a área util
	public void setTipo(){
		if(this.getAreaUtil() > 10.0)
			this.tipo = 'E';
		else
			this.tipo = 'N';
	}

	public double getAreaUtil(){
		return this.getLargura() * this.getProfundidade();
	}

	// Override do método toString herdado da classe Objetc
	// que nada mais é do que uma nova declaração do método
	public String toString(){
		return "Vaga [Codigo = " + this.numero + this.getLetra() + ", Profundidade = " + this.getProfundidade()
				+ ", Largura = " + this.getLargura() + ", Tipo = " + this.getTipo() + ", Area Útil = " + this.getAreaUtil() + "]"; 
	}
}

A quais linhas se refere o erro (aponta no código onde o erro é lançado) Linha 88 do Estacionamento e 25 do TesteEstacionamento.
O stackTrace ajuda…

Dei uma olhada rápida, mas você tentou debugar?
Coloca um breapoint uma linha antes da que deu o erro que de acordo com a pilha é a linha 88 da classe Estacionamento.
Tem algum objeto null naquela linha por isso que deu esse erro ^^

Boa tarde…
Está retornando um valor null(nulo) ou um valor que não existe, no tratamento da exceção,
quando busca um valor que ñ existe da essa mensagem…

Então…
Está ocorrendo no primeiro for da classe Estacionamento, na linha:

this.novasVagas[i].setLetra(ValoresConstantes.alfabeto[0]);

No debuger as variáveis estão assim antes do erro:

Name               Value
this	                Estacionamento  (id=30)	
linhasNormais	              5	
linhasEspeciais	              1	
i	                          0	

Onde você está populando esse array?
Não vi nenhum campo com atribuição de valores, apenas de tamanho à ele.

Vocês tem idéia do que eu devo fazer pra conseguir tirar esse erro?
é que eu não manjo mesmo… e já tentei tudo que eu sei pra resolver…e não deu certo

drsmachado estou populando no método setup da classe estacionamento…
você acha que está errado?

Nessa linha, se não me engano, o this.novasVagas[i] pode estar causando o erro pois pode estar nulo e o ValoresConstantes.alfabeto[0]…
Então verifique esses dois aí

O problema está em relação ao array Vaga novasVagas[]; pois você não o incializou.

No caso do array…
quando eu uso os métodos set… não funciona como inicialização?
pensei que estivesse inicializando dessa forma

Funciona.
A questão é que algum elemento está null, por isso, o erro. A questão é identificar qual elemento…

Desculpem se estou enchendo o saco de vocês com algo tão besta… mas é que não estou conseguindo resolver mesmo…
mas vou continuar tentando por aqui também.
Obrigado por estarem me ajudando galera.

Você está usando o eclipse?
Pois se estiver fica mais fácil de identificar essas coisas com o debugger, procure por elementos que estão null mas não deveriam estar…

Ok, vou procurar usando o debuger

Quando se cria um vetor com objetos de uma classe que possui um construtor que exige parâmetros… nesse caso a classe Vaga, é necessário passar valores de alguma forma para esse construtor ou quando vc inicializa o vetor já funciona como se estes valores estivessem sendo passados?
Não sei, mas acho que estou viajando já rs

Alguém mais tem alguma idéia sobre como eu posso resolver esse problema?
Acho que vou refazer tudo do inicio…não está dando certo assim e não tenho idéia do que fazer.