Erro - NullPointerException - Caelum ex. sobre arrays

Alguem poderia me ajudar nesse exercico da Apostila FJ-11 da Caelum?


class Empresa {
	
	String nome;
	String cnpj;
	Funcionario[] funcionarios;

	int posicaoVazia = 0;	

	void adiciona (Funcionario f) {
	this.funcionarios[this.posicaoVazia] = f;	
	this.posicaoVazia ++;

	}

}


class Funcionario {

	String nome;
	String departamento;
	double salario;
	Data dataEntrada;
	String rg;
	boolean onSite;
	

	void bonifica (double valor){
	this.salario += valor;	
	}


	void demite (){
	this.onSite = false;
		if (this.onSite == false) {
		System.out.println ("Ativo na Empresa: Desligado da Empresa." );
		}
	}


	void mostra () {
	System.out.println ("Funcionario: " + this.nome);

	this.bonifica(100);
	System.out.println ("Salario Atual: " + this.salario);

	this.demite();
	

	}

}




class TestaFuncionario {

	public static void main (String[] args) {
	
	Empresa empresa = new Empresa();
	empresa.funcionarios = new Funcionario[10];

	Funcionario f1 = new Funcionario();
	f1.nome = "Guilherme";
	f1.departamento = "Intervoice";

	Funcionario f2 = new Funcionario();	
	f2.nome = "GuiGui";
	f2.departamento = "INTV";

	empresa.adiciona(f1);
	empresa.adiciona(f2);

		for (int i = 0; i < empresa.funcionarios.length; i++) {
			empresa.funcionarios[i].mostra();
			}

		
	}

}

Dá erro na execução quando chamo o metodo mostra.

Tentei utilizar o for (int x: empresa.funcionarios)… percorrendo o array no java 5, mas dá erro de compilação…

O q estaria errado???

Olá Guilherme tudo bom? O problema é o seguinte kra, você criou um vetor de referencias a Funcionarios de 10 posições, mas só preencheu duas com as referências f1,e f2, essas o compilador imprimi certo, so que seu for vai ate 9, e as outras não estão preenchida, por isso dá NullPointerException ou seja a posição depois da 2 do seu vetor estão vazias.

Diminui o for e vc vai ver que roda direitinho.
Ex

for (int i = 0; i < 2; i++) {
empresa.funcionarios[i].mostra();   
}

E não vai gerar erro, ou seja você só tem 2 elementos do seu vetor referenciado, o resto referencia null, então quando vc chama funcionarios[3].mostra, é a mesma coisa que null.mostra que dá NullPointerException.

Espero que tenha ajudado.

Att

Posta o stack completo pra vermos aonde é o problema.

PS:Eu cheguei a desistir de Java quando não consegui passar desse exercício.
(Da segunda vez voltei do início e pulei essa parte, aprendi melhor depois)

empresa.funcionarios = new Funcionario[10];   

AH o encapsulamento…

ao inves do for tente usar um while verificando se o funcionario é null.

Vlw DanielBussade e demais…

Fiz merda no array… nao coloquei valores em todos… mas eu jura q ele iria imprimar algo como “Funcionario: null”…

Mas não consegui utilizar o novo eskema do JAVA 5 para percorrer todo o array:

for (int i : empresa.funcionarios) { empresa.funcionarios[i].mostra(); }

Segue o erro:

TestaFuncionario.java:76: incompatible types
found : Funcionario
required: int
for (int i : empresa.funcionarios) {
^
1 error

Código completo:

[code]

class Empresa {

String nome;
String cnpj;
Funcionario[] funcionarios;

int posicaoVazia = 0;	

void adiciona (Funcionario f) {
this.funcionarios[this.posicaoVazia] = f;	
this.posicaoVazia ++;

}

}

class Funcionario {

String nome;
String departamento;
double salario;
Data dataEntrada;
String rg;
boolean onSite;

void bonifica (double valor){
this.salario += valor;	
}

void demite (){
this.onSite = false;
	if (this.onSite == false) {
	System.out.println ("Ativo na Empresa: Desligado da Empresa." );
	}
}

void mostra () {
System.out.println ("Funcionario: " + this.nome);

}

}

class TestaFuncionario {

public static void main (String[] args) {

Empresa empresa = new Empresa();
empresa.funcionarios = new Funcionario[2];

Funcionario f1 = new Funcionario();
f1.nome = "Guilherme";
f1.departamento = "Intervoice";

Funcionario f2 = new Funcionario();	
f2.nome = "GuiGui";
f2.departamento = "INTV";

empresa.nome = "xxx";
empresa.cnpj = "12345678901234";

empresa.adiciona(f1);
empresa.adiciona(f2);

	for (int i : empresa.funcionarios) {
		empresa.funcionarios[i].mostra();
		}

	
}

}

Fala Guilherme blz? o enhanced-for do java 5, é mais utilizado para percorrer conjuntos do tipo Set onde não tem índice que podem ser recuperados com o for normal e o get. Mas pode ser usado tbm no vetor comum.
Para usar o enhanced-for a sintaxe é a seguinte:

for( [Tipo_do_elemento] variavel: )

Onde a expressão deve ser um arranjo(vetor, ou uma List, ou um Set, etc), sendo que a variável deve ser do tipo desse elemento.
Neste seu caso você tem um vetor de referencias para que? Para funcionario e tá tentando usar um for com int por isso o erro, olhe:

for (int i : empresa.funcionarios) {   
            empresa.funcionarios[i].mostra();   
            }  

empresa.funcionarios== vetor_de_referencias a Funcionario;
i== inteiro tipo primitivo;

Resultado:

found : Funcionario
required: int
for (int i : empresa.funcionarios) {
^
1 error

O erro está te dizendo você disse que era inteiro e depois colocou Funcionário, entendeu??

Pra consertar é so seguir a regra
for( [Tipo_do_elemento] variavel: )

A variavel deve ser do mesmo “tipo” da expressao entao ficaria assim:

for(Funcionario nome_qualquer: empresa.funcionario) // que é seu vetor
{
nome_qualquer.mostra();
}

Ou seja ela vai percorrer o vetor todo sempre chamando a mostra de cada um!!

Deu pra sacar??

Espero ter ajudado!!

Valeu