[Resolvido]Erro na hora de executar o TestaEmpresa java.lang.NullPointerException

14 respostas
olivercld

eu não consegui entender porque deu este erro na hora de executar a classe de teste

//metodo funcionario

Funcionario(String nome, String dpt, double salario, String rg, boolean esta, Data dataEnt) { this.nome = nome; this.departamento = dpt; this.salario = salario; this.rg = rg; this.estaAtivo = esta; this.dataEntrada = dataEnt; }// fim

//método main com o erro não entendi apesar de pesquisar como faria tentei assim com o exemplo:

package exercícios;

package videoAulaNeri;

public class TestaEmpresa {
	public static void main(String[] args) {
		Funcionario[] empre = new Funcionario[10];// cria um vetor com 10
														// posicoes

		// faz a referencia ao array e estipula sua quantidade de
		// posições do mesmo
		Empresa emp = new Empresa(empre);
		//estou adicionado funcionarios dentro da empresa agora
		empre[0] = new Funcionario("Rob", " RH ", 1800, "123654", true, new Data (12,10,2011));
		
		Funcionario adc = new Funcionario("Yoga", " Assist. ", 800, "123584", true, new Data (12,8,2011));
		
		System.out.println(emp.adiciona(adc));
		emp.mostraFuncionarios();
		
	}

}

não entendi ?

saída:

o erro que acusa na linha 37 esta neste método, linha 37 e onde tem o if empregados na posição i for igual a nulo.

public boolean adiciona(Funcionario f) { for (int i = 0; i < empregados.length; i++) {// a funcao length da o // tamanho de um Array/Vetor // procura uma posicao vazia , para adicionar um funcionario if (this.empregados[i].equals(null)) {// se funcionario for igual // a null // significa que naquela posicao nao tem nenhum funcionario // entao this.empregados[i] = f;// adiciona return true; } } throw new IllegalArgumentException("Erro vetor cheio: "); //return false;// se nao tiver mais espaco retorna falso }

erro da linha 16 no main:
[list] System.out.println(emp.adiciona(adc)); [/list]

14 Respostas

N

Dentro do construtor da classe Empresa, você está atribuindo o array empre a variável global empregados?

Se não tiver feito isso e a variável global empregados estiver como null você obterá uma NullPointerException ao tentar acessar algum atributo ou método dessa variável.

wender.jean
Funcionario(String nome, String dpt, double salario, String rg, boolean esta,  
            Data dataEnt) {  
        this.nome = nome;  
        this.departamento = dpt;  
        this.salario = salario;  
        this.rg = rg;  
        this.estaAtivo = esta;  
        this.dataEntrada = dataEnt;  
}
Funcionario[] empre = new Funcionario[10];// cria um vetor com 10  
   Empresa emp = new Empresa(empre);

Pelo que percebi você esta passando um vetor para o construtor do seu objeto “Funcionario” porém o mesmo não espera por um vetor.

Como se comporta o seu método “adiciona()” ? Posta ai pra gente ver.

lina

Oi,

empregados.length ?

Tchauzin!

wender.jean

Bom,

if (this.empregados[i].equals(null))

Você precisa verificar se a posição e nula então use:

if (this.empregados[i] == null)

O metodo “equals” verifica o conteudo de um objeto e como o objeto e nulo ele lança a exceção “NullPointerException”.

olivercld

Algum progresso veja saiu alguma coisa agora:
Saída:

acima eu só não entendi agora porque fica saindo varios null null, é porque foi criado 10 posições e não foi preenchido ou nada haver?

Abaixo o método adiciona como solicitado:
troquei o equals pelo == e imprimiu resultado que aparece acima.

public boolean adiciona(Funcionario f) {
		for (int i = 0; i < empregados.length; i++) {// a funcao length da o
			// tamanho de um Array/Vetor
			// procura uma posicao vazia , para adicionar um funcionario
			if (this.empregados[i] == null) {// se funcionario for igual
				// a null
				// significa que naquela posicao nao tem nenhum funcionario
				// entao
				this.empregados[i] = f;// adiciona
				return true;
			}
		}
		throw new IllegalArgumentException("Erro vetor cheio: ");
		//return false;// se nao tiver mais espaco retorna falso
	}
wender.jean

Ele fica imprimindo “null” por que não deve estar tratado no metodo “mostraFuncionarios()”, coloca la pra imprimir so as posições que forem diferentes de “null”.

if(this.empregados[i] != null) {
   System.out.println(this.empregados[i]);
}
olivercld

fera wender.jean deu certo, antes o método para mostrar funcionários estava para percorrer assim: for( Funcionario f : this.empregados){

tentei esta forma dentro deste for mais nao consegui então mudei o FOR e agora não imprime mais os nulls

antes:
for (Funcionario f : this.empregados) {
			// percorre o Array/Vetor de empregados e mostra
			// eles contidos no meu vetor
			System.out.println(f);
		}
depois:
for (int i = 0; i < this.empregados.length; i++) {
			
			if (this.empregados[i] != null) {
				System.out.println(this.empregados[i]);
			}
		}
olivercld

Só mais uma questão aqui neste método contem para verificar se o empregado esta nao estou conseguindo acessar this.empregados[i].nome acessar pelo nome ou outro item nao me da a opçao veja:

public boolean contem(Funcionario f){
		boolean Contem = false;
		for(int i = 0; i< this.empregados.length; i++ ){
			if(this.empregados[i]. ){//não aparece a opção nome nem uma outra que quro verificar pelo nome ou rg s ele esta porque está acontecendo isto ?
				Contem =  true;
wender.jean

Não seria mais fácil você usar “List” no lugar de array? Assim você não teria problemas de posições nulas e poderia usar o for inteligente tranquilamente.

Seu metodo “adicionar” eliminaria toda aquela lógica e conteria apenas estas linhas:

List<Funcionario> empregados = new ArrayList<Funcionario>();
empregados.add(f);

Você pode ainda utilizar o tipo genérico para indicar que esta lista recebera apenas objetos do tipo “Funcionario”, uma coisa até necessária para se poder utilizar o for inteligente posteriormente.

Bom, agora se você preferir utilizar o array mesmo, tente criar uma instancia da posição não nula do array:

if (this.empregados[i] != null) {
    Funcionario obj = (Funcionario) this.empregados[i];
    System.out.println(obj.getNome());
}
olivercld
wender.jean, aderi a sua ideia mudando o método adiciona para List, que no caso list ele pode redimensionar caso eu quisesse não tem um tamanho fixo, como o Array certou ? bom problema agora e que ao alterar o código para:
List<Funcionario> empregados = new ArrayList<Funcionario>();
		empregados.add(f);
ao executar ele dá erro na linha 50 que contem o exception e na main :[list]Exception in thread "main" java.lang.IllegalArgumentException: Erro vetor cheio: at exerciciosOO.Empresa.adiciona(Empresa.java:50) at exerciciosOO.TestaEmpresa.main(TestaEmpresa.java:17)[/list] linha do Exception no método adiciona :
throw new IllegalArgumentException("Erro vetor cheio: ");
linha 17 do erro na main:
System.out.println(emp.adiciona(adc));
método adiciona:
public boolean adiciona(Funcionario f) {
		List<Funcionario> empregados = new ArrayList<Funcionario>();
//List cria se uma lista "vetor" de funcionarios, nova arrayList, um novo vetor
		empregados.add(f);//empregados adiciona ao argumento
		
		throw new IllegalArgumentException("Erro vetor cheio: ");
		// return false;// se nao tiver mais espaco retorna falso
	}
porque deu este erro, por o array estar cheio mesmo ou pelo método que ficou como booleano ?
wender.jean

Retira esta linha:

throw new IllegalArgumentException("Erro vetor cheio: ");

Já que agora você esta trabalhando com uma lista não precisa mais lançar esta exceção.

olivercld

ok brother valeu mais uma vez esta me orientando pra caramba… qualuqer duvida volto aqui ainda nao esta resolvido…

olivercld
enroscado no mesmo exercicio, alterei metodo adiciona o metodo mostraFunc, veja abaixo:
public void mostraFuncionarios() {
		for (Funcionario f : this.empregados) {
			// percorre o Array/Vetor de empregados e mostra
			// eles contidos no meu vetor
			if (this.empregados != null) {
				System.out.println(f);
			}
		}
	}
1º duvida como posso fazer para que não volte ao mesmo problema de antes imprimir null apos imprimir o resultado ? vi que o if no caso nao esta fazendo nada e não é a forma certa, como posso estar fazendo ? //método adiciona como esta.
public boolean adiciona(Funcionario f) {
		List<Funcionario> empregados = new ArrayList<Funcionario>();
		return empregados.add(f);

		// return false;// se nao tiver mais espaco retorna falso
	}
olivercld

Bom acho que este topico já ficou meio que ultrapasado, então duvidas posteriores serão abertas apenas para a tal duvida, o metodo mostraFunc deixei como estava antes para nao ficar mostrando null apos imprimir o que queria. ficou desta forma:public void mostraFuncionarios(){ for(int i =0; i< this.empregados.length; i++){ if(this.empregados[i] != null){ Sysout(this.empregados[i]); } }

desde já, sempre não poderei esquecer de agradecer a cada resposta e explicação dos colegas…

Criado 27 de dezembro de 2011
Ultima resposta 9 de jan. de 2012
Respostas 14
Participantes 4