Ajuda com NullPointerException em Java

16 respostas
J

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() + "]"; 
	}
}

16 Respostas

drsmachado

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…

P

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 ^^

F

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…

J

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
drsmachado

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

J

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

J

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

P

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í

A

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

J

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

drsmachado

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

J

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.

P

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…

J

Ok, vou procurar usando o debuger

J

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

J

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.

Criado 26 de maio de 2011
Ultima resposta 26 de mai. de 2011
Respostas 16
Participantes 5