Pequena duvida com ponteiros e vetores

Tá, estou a uma hora e meia quebrando a cabeça pra saber o que está errado nisso.Comecei agora em POO e escolhi o Java como a línguagem inicial a se estudar o POO e Java, ou seja, estou aprendendo os dois ao mesmo tempo.A duvida é o seguinte:

Tem os seguintes códigos abaixo, o primeiro parece ser o mais problematico, os 3 são classes que (pelo menos deveriam) relacionam entre sí.Sempre que tento atribuir o valor de uma classe à um metodo que está na outra classe acaba dando erro dizendo que os ponteiros são nulos.

Não estou a procura de exercicios resolvidos, tanto é que esse exercicio é da apostila da Caelum que uso pra estudo próprio em casa, o que realmente quero é uma explicação do que está dando errado, ou melhor, o que eu estou fazendo errado.Qualquer sugestão é bem vinda, até mesmo o código resolvido(iria perder a graça do meu exercicio mas eu REALMENTE não consigo achar o que está errado aí).

[code]public class Empresa
{
String cnpj;
Funcionario[] empregados;

 public void adiciona(Funcionario f)
 {
	
	this.empregados[0] = f; //Não sei em qual array armazenar a variavel sendo que vou 
	                       //armazenar mais de uma vez.Sempre que tento compilar
	//fala que o ponteiro é nulo
	 
 }

}
[/code]

Essa é a class em que o ponteiro está dando problema, vide os comentários feitos por mim;

[code]public class TesteEmpresa
{

public static void main(String[] args) 
{
	Empresa empresa = new Empresa();
	//empresa.empregados = new Funcionario[10];
	//Funcionario[] f1 = new Funcionario[10];
	Funcionario f2 = new Funcionario();
	f2.salario = 100;
	//f1[0] = f2;
	empresa.adiciona(f2);			
		

}

}
[/code]

Essa é a class que…hmm…que eu queria armazenar os dados naquele vetor onde se situa o ponteiro problematico.

public class Funcionario 
{
	String nome;
	String departamento;
	double salario;
	Data dataEntrada = new Data();
	String RG;
	String endereco;
	boolean estaNaEmpresa;	

	
	
	 void bonifica(double aumento)
	 {
		this.salario+= aumento; 
	 }
	  void demite()
	  {
		  this.estaNaEmpresa = false;		  
	  }
	   void mostra()
	   {
		   
		   System.out.println("Nome: "+this.nome);	
		   System.out.println("Entrada em "+this.dataEntrada.dia+"/"+this.dataEntrada.mes+"/"+this.dataEntrada.ano);
		   System.out.println("Departamento: "+this.departamento);
		   System.out.println("Salário: "+this.salario);
		   System.out.println("RG: "+this.RG);
		   System.out.println("Endereço: "+this.endereco);
		   
	   }
	   	  
}

Novamente, qualquer ajuda é bem vinda, sorry por alguma má formatação no post ou afins.

O erro de ponteiro nulo é a NullPointerException, certo?
Isso acontece porque pra usar um objeto você precisar instanciar ele. Então quando você chama o método adicionar (empresa.adiciona(f2)), você vai adicionar em um array que não foi instanciado. Pra arrumar isso, você pode tanto tirar o comentário depois da linha que você cria o empresa (linha 8 de TesteEmpresa) ou fazer uma verificação dentro do adiciona em Empresa:

public void adiciona(Funcionario f) { if (empregados == null) { empregados = new Funcionario[10]; } this.empregados[0] = f; }
Quando você retira o comentário da linha 8 de TesteEmpresa, dá o mesmo erro?

[quote=Andre Brito]O erro de ponteiro nulo é a NullPointerException, certo?
Isso acontece porque pra usar um objeto você precisar instanciar ele. Então quando você chama o método adicionar (empresa.adiciona(f2)), você vai adicionar em um array que não foi instanciado. Pra arrumar isso, você pode tanto tirar o comentário depois da linha que você cria o empresa (linha 8 de TesteEmpresa) ou fazer uma verificação dentro do adiciona em Empresa:

public void adiciona(Funcionario f) { if (empregados == null) { empregados = new Funcionario[10]; } this.empregados[0] = f; }
Quando você retira o comentário da linha 8 de TesteEmpresa, dá o mesmo erro?
[/quote]

Então cara, meu professor sempre disse "Meu professor sempre falou ‘nunca apage linhas, sempre as comente’ " e vi que realmente foi util agora.

Voltando ao tópico, antes de vir postar aqui eu tentei deixar somente aquela linha(8, empresa) e (comentar) apagar as restantes que não eram “usaveis”, dava o mesmo erro mas agora com isso que você acabou postando deu certo, comentando aquela linha ou não, agora vou finalmente prosseguir no meu aprendizado, hehe.

Confesso que realmente não entendi* a sua explicação toda mas já deu pra pegar o que eu fiz de errado, vou ficar dando uma lida nesse código quando termina-lo pra entender melhor esse erro de instanciação que eu fiz.

Agradeço mesmo pela ajuda colega!

Tem razão, ficou mau explicado.
É mais ou menos assim… Todo ‘nome de varíavel’ aponta pra um objeto na memória. Então, quando você escreve:

Empresa empresa = new Empresa();,
empresa é uma referência para um objeto que foi criado na memória. Ele aponta pra um objeto dentro da Heap (a memória) que o Java tem. Se você não instanciar (tirar o new Empresa() dali), quer dizer que ele não vai apontar pra nada. Consequentemente, se ele não aponta pra nada, você não tem como chamar um método (como adiciona) nem acessar as variáveis, porque você não está apontando pra um lugar na memória.
No seu array, você tem Funcionario[] funcionarios;
Isso quer dizer que você declara (e não cria) um array de objetos do tipo Funcionario. Ou seja, é só uma declaração, não existe nada criado ainda.
Quando você faz o seguinte Funcionario[] funcionarios = new Funcionario[4]; você cria 4 objetos do tipo Funcionario na memória, onde cada índice (funcionarios[0], funcionarios[1], …) aponta pra um objeto criado. Aí vai funcionar porque as referências apontam, de fato, para um (ou vários) objeto (s) na memória.

[quote=Andre Brito]Tem razão, ficou mau explicado.
É mais ou menos assim… Todo ‘nome de varíavel’ aponta pra um objeto na memória. Então, quando você escreve:

Empresa empresa = new Empresa();,
empresa é uma referência para um objeto que foi criado na memória. Ele aponta pra um objeto dentro da Heap (a memória) que o Java tem. Se você não instanciar (tirar o new Empresa() dali), quer dizer que ele não vai apontar pra nada. Consequentemente, se ele não aponta pra nada, você não tem como chamar um método (como adiciona) nem acessar as variáveis, porque você não está apontando pra um lugar na memória.
No seu array, você tem Funcionario[] funcionarios;
Isso quer dizer que você declara (e não cria) um array de objetos do tipo Funcionario. Ou seja, é só uma declaração, não existe nada criado ainda.
Quando você faz o seguinte Funcionario[] funcionarios = new Funcionario[4]; você cria 4 objetos do tipo Funcionario na memória, onde cada índice (funcionarios[0], funcionarios[1], …) aponta pra um objeto criado. Aí vai funcionar porque as referências apontam, de fato, para um (ou vários) objeto (s) na memória.[/quote]

Sim, agora ficou claro, meu caro.A parte em que eu declarava as arrays eu já estava ciente mas alí a parte do “new Empresa();” eu, até o seguinte momento, pensava que estava certa e seguindo os padrões de sintaxe.

Emfim, a parte curiosa de todo esse alvoroço que eu fiz por causa desse código é que eu simplesmente fui copiando o que estava na apostila para testar e entender como os objetos funcionam com vetores, engraçado é que mesmo copiando eu consegui errar, se é que eu copiei algo errado pois fiz tudo a marca.

Emfim, valeu pela explicação cara, na apostila não entraram muito em detalhes como funciona os vetores com objetos, agradeço a atenção. :slight_smile: