[duvida] java.lang.NullPointerException

pq ta dando isso?

"--------------------Configuration: --------------------
Exception in thread “main” java.lang.NullPointerException
at Orgao.main(Orgao.java:19)

Process completed."


class Empresas {
	String cnpj;
	Funcionarios[] empresaFuncList;

	void adicionaFunc (Funcionarios f, int x) { // acredito que o erro esteja na minha sintaxe aqui....
		this.empresaFuncList[x] = f;
	}
}

class Funcionarios {
	String name;
	int age;
}

public class Orgao {
	public static void main(String args[]) {

		Funcionarios[] funcList = new Funcionarios[100];

		funcList[0].name = "John";
		funcList[0].age = 31;

		funcList[1].name = "Mark";
		funcList[1].age = 29;

		Empresas eletroShop = new Empresas();
		eletroShop.empresaFuncList = new Funcionarios[8];

		eletroShop.adicionaFunc (funcList[1], 0); //aqui que ta dando problema, ele deveria adicionar o funcionário "funcList[1]"(Mark) na lista de funcionarios "empresaFuncList" da empresa "eletroShop" na posição "0", mas estou fazendo algo errado!


	}
}

Onde vc inicializa a variável eletroShop?

copiei o codigo errado. agora editei e consertei.

eh q na hora de copiar o codigo pra ca eu fiz mudanças pra ficar mais facil pro pessoal aqui ler e entender

enfim, taih o codigo, e ta dando esse erro ai q eu botei… =(

class Empresas {  
    String cnpj;  
    Funcionarios[] empresaFuncList;  //Falta inicializar o array antes de adicionar valores, por exemplo, Funcionarios[] empresaFuncList = new  Funcionarios[100];
  
    void adicionaFunc (Funcionarios f, int x) { // acredito que o erro esteja na minha sintaxe aqui....  
        this.empresaFuncList[x] = f;  
    }  
}

[quote=Giulliano][code]
class Empresas {
String cnpj;
Funcionarios[] empresaFuncList; //Falta inicializar o array antes de adicionar valores, por exemplo, Funcionarios[] empresaFuncList = new Funcionarios[100];

void adicionaFunc (Funcionarios f, int x) { // acredito que o erro esteja na minha sintaxe aqui....  
    this.empresaFuncList[x] = f;  
}  

}
[/code][/quote]

eu fiz isso na main… pq se eu fizer na classe Empresa, toda empresa q eu criar vai ter o mesmo numero de funcionarios. fazendo isso na main eu posso definir diferentes tamanhos de listas para diferentes empresas

Cara… tenta assim…

[code]class Empresas {
String cnpj;
Funcionarios[] empresaFuncList;

void adicionaFunc (Funcionarios f, int x) { // acredito que o erro esteja na minha sintaxe aqui....
    this.empresaFuncList[x] = f;
}

}

class Funcionarios {
String name;
int age;
}

public class Orgao {
public static void main(String args[]) {

    Funcionarios[] funcList = new Funcionarios[]{new Funcionarios(), new Funcionarios()};

    funcList[0].name = "John";
    funcList[0].age = 31;

    funcList[1].name = "Mark";
    funcList[1].age = 29;

    Empresas eletroShop = new Empresas();
    eletroShop.empresaFuncList = new Funcionarios[8];

    eletroShop.adicionaFunc(funcList[1], 0);
}

}[/code]

Lembras que quando crias um Array de Funcionarios, ainda nao tens nenhum Objeto funcionario para esse Array… quando fizeres o funcList[0].name

esse funList[0] não tem nenhum Objeto pra poder chamar seu atributo name… Por isso o nullPointer…

[EDIT] Pode ser assim também

[code]funcList[0] = new Funcionarios();
funcList[0].name = “John”;
funcList[0].age = 31;

    funcList[1] = new Funcionarios();
    funcList[1].name = "Mark";
    funcList[1].age = 29;[/code]

[quote=adriano_si]Cara… tenta assim…

[code]class Empresas {
String cnpj;
Funcionarios[] empresaFuncList;

void adicionaFunc (Funcionarios f, int x) { // acredito que o erro esteja na minha sintaxe aqui....
    this.empresaFuncList[x] = f;
}

}

class Funcionarios {
String name;
int age;
}

public class Orgao {
public static void main(String args[]) {

    Funcionarios[] funcList = new Funcionarios[]{new Funcionarios(), new Funcionarios()};

    funcList[0].name = "John";
    funcList[0].age = 31;

    funcList[1].name = "Mark";
    funcList[1].age = 29;

    Empresas eletroShop = new Empresas();
    eletroShop.empresaFuncList = new Funcionarios[8];

    eletroShop.adicionaFunc(funcList[1], 0);
}

}[/code]

Lembras que quando crias um Array de Funcionarios, ainda nao tens nenhum Objeto funcionario para esse Array… quando fizeres o funcList[0].name

esse funList[0] não tem nenhum Objeto pra poder chamar seu atributo name… Por isso o nullPointer…

[EDIT] Pode ser assim também

[code]funcList[0] = new Funcionarios();
funcList[0].name = “John”;
funcList[0].age = 31;

    funcList[1] = new Funcionarios();
    funcList[1].name = "Mark";
    funcList[1].age = 29;[/code][/quote]

deu certo, mas nao entendo oq vc fez, pq vc repetiu o “new Funcionarios()” ? minha array n ficou sem tamanho definido desse jeito? como q funciona?

ahhhhhhhhhhhhhhhhhhh

entendi!!!

daquele jeito “Funcionarios[] funcList = new Funcionarios[]{new Funcionarios(), new Funcionarios()};” nao deu erro mas eu tbm n entendi a logica disso

Cara… Quando você instancia um Array… imagina que você está criando um Objeto que guarda valores… Quando você faz isso

Funcionarios[] funcList = new Funcionarios[100];

Você está criando somente 1 Objeto que é um Array de Funcionários e dizendo que esse Objeto tem espaço pra receber 100 Objetos do tipo Funcionarios. Porém você não tem nenhum Objeto Funcionarios criado, voc~e só tem a vaga do estacionamento mas não tem nenhum carro estacionado nessa vaga. Quando você pede pra ele setar a propriedade nama do funcList[0] no espaço [0] não existe um objeto Funcionarios, logo a VM emite um NullPointer, pois não há nada pra quem ela possa setar um nome…

Essa sintaxe

Funcionarios[] funcList = new Funcionarios[]{new Funcionarios(), new Funcionarios()};

nada mais é do que uma forma de iniciar o Array colocando 2 Objetos dentro dele…

Falows :wink: