Dúvida em Array;

15 respostas
ricardork

Salve...

Estou resolvendo um exercício da fj11 Caleum e acontece o seguinte.

class Testa
	{
	public static void main(String args[])
		{
			Empresa empresa = new Empresa();
			int i = 0;
			 /* Funcionario f1 = new Funcionario();  
          		 f1.salario = 1000;  
           		empresa.emprega(f1);  
             
  
          		 Funcionario f2 = new Funcionario();  
           		 f2.salario = 1700;  
           			empresa.emprega(f2);  
  
                         Funcionario f3 = new Funcionario();  
                         f3.salario = 1100;  
                         empresa.emprega(f3);  
  
                         Funcionario f4 = new Funcionario();  
                         f4.salario = 900;  
                        empresa.emprega(f4);	*/
			for(i = 0; i < 3; i++);
				{
				Funcionario f = new Funcionario();
				f.nome = "aaa";
				f.departamento = "eee";
				f.admissao = "12345";
				f.salario = 1000 + i * 100;
				f.status = true;
				empresa.emprega(f);
				empresa.quadroFuncionario();
				}	
		
		
		}
	
	}

class Funcionario
	{
	String nome;
	String admissao;
	String departamento;
	String cpf;
	double salario;
	boolean status;
	}
class Empresa
	{
	String nome;
	String cnpj;
	Funcionario[] empregado = new Funcionario[3];
	static int contador = 0;
		void emprega(Funcionario f)
			{
			for(int i = 0; i < empregado.length; i++)
			if(empregado[i] == null)
				{
				empregado[i] = f;
				break;
				}
			}
		public void quadroFuncionario()
			{
			for(int i = 0; i < empregado.length; i++)
				{
				System.out.println(empregado[i].salario);
				}
			}
	}
Quanto utilizo a linha de código comentada na Classe Testa, funciona corretamente, quando tento adicionar os funcionarios com o metodo emprega(f) através do for que criei na classe Testa, o metodo quadroFuncionario apresenta um erro que pelo que entendo significa que empregado[1].salario é igual a null.

O erro é o seguinte:
Exception in thread "main" java.lang.NullPointerException
at Empresa.quadroFuncionario(EmpresaFuncionario.java:29)
at Testa.main(Testa.java:32)

Alguém entende o que acontece?

Fico no aguardo de uma ajuda.

Grato!

15 Respostas

fuadksd

teu array só tem 3 posições.
tu ta tentando colocar mais funcionários nele.

ricardork

Não amigo.

fuadksd

não?

dica. bota teu código entre as tags [code] e indenta ele

ricardork

Não consegui "i"ntender o que você disse. Mas, para garantir coloquei 10 posições na Array, e ele não imprimiu as 4 que estou tentando adicionar pelo for da class Testa, logo na segunda ele acusa que a array esta vazia. Mas no código comentado, adicionando um de cada vez, ele funciona perfeitamente.

fuadksd

tira a chamada empresa.quadroFuncionario() de dentro do for

bota ela embaixo

ricardork

Já o fiz, persegue o erro!

gustavo_mb

Poste seu código dentro da tag code. Vou fazer isso para você:

class Testa {
	public static void main(String args[]) {
		Empresa empresa = new Empresa();
		int i = 0;
		/*
		 * Funcionario f1 = new Funcionario(); f1.salario = 1000;
		 * empresa.emprega(f1);
		 * 
		 * 
		 * Funcionario f2 = new Funcionario(); f2.salario = 1700;
		 * empresa.emprega(f2);
		 * 
		 * Funcionario f3 = new Funcionario(); f3.salario = 1100;
		 * empresa.emprega(f3);
		 * 
		 * Funcionario f4 = new Funcionario(); f4.salario = 900;
		 * empresa.emprega(f4);
		 */
		for (i = 0; i < 3; i++)
			;
		{
			Funcionario f = new Funcionario();
			f.nome = "aaa";
			f.departamento = "eee";
			f.admissao = "12345";
			f.salario = 1000 + i * 100;
			f.status = true;
			empresa.emprega(f);
			empresa.quadroFuncionario();
		}

	}

}
class Funcionario {
	String nome;
	String admissao;
	String departamento;
	String cpf;
	double salario;
	boolean status;
}
class Empresa {
	String nome;
	String cnpj;
	Funcionario[] empregado = new Funcionario[3];
	static int contador = 0;

	void emprega(Funcionario f) {
		for (int i = 0; i < empregado.length; i++)
			if (empregado[i] == null) {
				empregado[i] = f;
				break;
			}
	}

	public void quadroFuncionario() {
		for (int i = 0; i < empregado.length; i++) {
			System.out.println(empregado[i].salario);
		}
	}
}

O problema é que quando você escreve Funcionario[] empregado = new Funcionario[3];, você apenas está alocando na memória espaço para os 3 funcionário, mas ainda é preciso instância-los individualmente.

Faça o seguinte:

public void quadroFuncionario() {
		for (int i = 0; i < empregado.length; i++) {
			if(empregado[i] == null) {
				empregado[i] = new Funcionario();
				System.out.println(empregado[i].salario);
			}
			
		}
	}
fuadksd

Sim. O problema é que a cada iteração do for que emprega os funcionarios, ele está chamando o método quadroDeFuncionarios, que por ua vez itera um array com nulls.

Bote a chamada quadroDeFuncionarios() fora do for

ricardork

Ele resolve parcialmente o problema, agora ele imprimi todas as posições da Array, porém não com os valores esperados no for da classe Testa.

fuadksd

deveria ser 1000 1100 1200

gustavo_mb

Faz assim:

public void quadroFuncionario() {
		for (int i = 0; i < empregado.length; i++) {
			if(empregado[i] == null) {
				empregado[i] = new Funcionario();
				empregado[i].salario = i * 1000;
				System.out.println(empregado[i].salario);
			} else {
				System.out.println(empregado[i].salario);
			}
			
		}
	}
fuadksd
gustavo_mb:
Faz assim:
public void quadroFuncionario() {
		for (int i = 0; i < empregado.length; i++) {
			if(empregado[i] == null) {
				empregado[i] = new Funcionario();
				empregado[i].salario = i * 1000;
				System.out.println(empregado[i].salario);
			} else {
				System.out.println(empregado[i].salario);
			}
			
		}
	}

mas o problema é no main. se ele fizer isso, vai criar funcionarios aleatórios só pra preencher o array.

melhor assim

public void quadroFuncionario() {
		for (int i = 0; i < empregado.length; i++) {
			if(empregado[i] != null) {
				System.out.println(empregado[i].salario);
                        }
			
		}
	}
[/quote]
ricardork

Fazer isso já foge da lógica inicial, pode até resolver, mas foge da linha de raciocínio que estava seguindo. Não consegui compreender bem ainda o que acontece.

denisfm

Olá!

empresa.quadroFuncionarios tem que ficar for do for!

Aqui funcionou, mas insere os mesmos nomes de funcionario, etc. Só muda o salário, mesmo.

class TestaEmpresa {
	public static void main(String[] args)
	{ 
		TestaEmpresa testaEmpresa = new TestaEmpresa();
		testaEmpresa.funciona();
	}

	private void funciona()
	{
		Empresa empresa = new Empresa();
		for (int i = 0; i < 3; i++)
		{
			Funcionario f = new Funcionario();
			f.nome = "asdasd";
			f.departamento = "asdasd";
			f.admissao = "03102011";
			f.salario = 1000 + i *100;
			f.status = true;
			empresa.emprega(f);
			//empresa.quadroFuncionario(); da NullPointerException
		}
		empresa.quadroFuncionario();// aqui funciona
	}

	class Funcionario
	{
		String nome;
		String admissao;
		String departamento;
		String cpf;
		double salario;
		boolean status;
	}
	class Empresa
	{
		int contador = 0;
		String nome;
		String cnpj;
		Funcionario[] empregado = new Funcionario[3];

		private void emprega(Funcionario f)
		{
			for (int i = 0; i < empregado.length; i++)
			{
				if (empregado[i] == null)
				{
					empregado[i] = f;
					break;
				}
			}
		}
		public void quadroFuncionario()
		{
			for (int i = 0; i < empregado.length; i++)
			{
				System.out.println("Nome do empregado: "+empregado[i].nome+" , com salário de: "+empregado[i].salario);

			}
		}

	}
}

Vc quer entender porque dar NullPointerException ou o quê?

Abraços!

ricardork

Amigos, agradeço a todos que responderam, a ultima solução solucionou minha dúvida. Eu estava criando dois arquivos .txt separado, um com a classe Testa e o outro com as classes Funcionario e Empresa. O problema foi resolvido, mas para finalizar alguém pode me explicar o que acontecia compilando separadamente?

Abraço!

Criado 3 de outubro de 2011
Ultima resposta 5 de out. de 2011
Respostas 15
Participantes 4