Erro Exception in thread "main" java.lang.NullPointerException ao atribuir valores a um array do tipo objecto

12 respostas
vetorarrayjava
A

Boas colegas. Estou exercitando com base em alguns exercícios de java e deparei me com o erro Exception in thread “main” java.lang.NullPointerException. Já tenho uma notação que geralmente esse erro aparece quando não inicializamos um objecto. Certo?
O exercício é o seguinte:
Crie uma classe Contato que possui dois atributos: nome e email do tipo String. Crie outra classe, chamada Agenda, que possui um atributo contatos do tipo vetor de Contato. A classe Agenda deve conter um método para adicionar um novo contato em uma posição vazia do vetor, outro método para buscar um contato (retorna uma instância de Contato) através do nome e, por fim, um método para excluir um contato através do nome.

O erro é o seguinte:

java.lang.NullPointerException
** at pacote.setimoexercicio.Agenda.addContact(Agenda.java:16)**
** at pacote.setimoexercicio.ClassMain.main(ClassMain.java:7)**

Criei uma interface que será responsável por essas ações exigidas no exercício e que será implementada pela classe agenda, a classe esta abaixo e a linha do erro está a negrito. Onde falhei?

public class Agenda implements metodosContatos {
	Contacto[] vetorContacto = new Contacto[20];
	private Scanner entrada = new Scanner(System.in);

	@Override
	public void addContact() {
		try {
			String auxiNome = "", auxiEmail = "";
			for (int cont = 0; cont < vetorContacto.length; cont++) {
				System.out.println("Insira o nome de contacto: ");
				auxiNome = entrada.next();
				**vetorContacto[cont].setNome(auxiNome);**

				System.out.print("Insira o e-mail do contacto: ");
				auxiEmail = entrada.next();
				vetorContacto[cont].setEmail(auxiEmail);

				System.out.println("Quer adicionar mais algum contacto?");
				String resp = entrada.next();
				if (resp == "n" || resp == "N") {
					break;
				}
			}
			
		} catch (Exception e) {
			e.printStackTrace();
		}
		

	
	}

	/* Metodo da interface que ira returnar */
	@Override
	public Contacto returnContact(String nomeContacto) {

		return null;
	}

	/* Metodo que ira excluir um contacto */
	@Override
	public void deleteContact(String nomeContacto) {
		// TODO Auto-generated method stub

	}

}

abaixo é o classe contacto:

public class Contacto {
	/*Variaveis de objecto da classe contacto*/
	private String nome;
	private String email;
	
	/*Metodo acessores e modificadores*/
	public String getNome() {
		return nome;
	}
	public void setNome(String nome) {
		this.nome = nome;
	}
	public String getEmail() {
		return email;
	}
	public void setEmail(String email) {
		this.email = email;
	}

}

Onde foi que errei?

12 Respostas

S

Você não inseriu nenhum objeto Contacto no seu vetor.

F

Aparentemente, você não inicializou o objeto do tipo Contato na posição do vetor.

Inicialize o objeto na posição cont antes de capturar os valores:

<strong>vetorContacto[cont] = new Contacto();</strong>

System.out.println("Insira o nome de contacto: ");

auxiNome = entrada.next();

vetorContacto[cont].setNome(auxiNome);
System.out.print("Insira o e-mail do contacto: ");
			auxiEmail = entrada.next();
			vetorContacto[cont].setEmail(auxiEmail);

Você pode inicializar depois de capturar também, passando os atributos pelo construtor, caso tenha criado um construtor para isso.

vetorContacto[cont] = new Contacto(auxiNome, auxiEmail);

F

Experimente o TetrisIDE. Ele te ajuda a construir aplicações rápidas em Java com pouca codificação.

http://tetris.analisasoftware.com.br/br/

A

Obrigado! Era isso mesmo

A

Obrigado

F

Disponha, amigo!

A

Boas estou com alguns erros neste exercício… Os métodos já estão criados, mas em alguns, momentos na execução do programa aparece o erro Exception in thread "main" java.lang.NullPointerException tentei chegar ao erro, mas não consegui… Essa exceção é disparada sempre que pretendo realizar a segunda remoção lançando o seguinte erro:

Exception in thread "main" java.lang.NullPointerException 
	at pacote.setimoexercicio.Agenda.deleteContact(Agenda.java:71)
	at pacote.setimoexercicio.Agenda.main(Agenda.java:149)
	at pacote.setimoexercicio.ClassMain.main(ClassMain.java:9)

O código do método é este: ** = linha do código onde aponta o erro (Agenda.java:71)

@Override
	public Contacto deleteContact(String nomeContacto) {
		for (int cont = 0; cont < vetorContacto.length; cont++) {
//			vetorContacto[cont] = new Contacto();
			if (vetorContacto[cont].getNome().equals(nomeContacto)) {
				vetorContacto[cont].setEmail(null);
				vetorContacto[cont].setNome(null);
				System.out.println("Contacto excluido com sucesso!");
				break;
			} else if (vetorContacto[cont].getNome() == null) {
				System.out.println("O contacto nao existe");
			}
		}
		

		return contacto;
	}

Uma outra barreira que me deparei foi ao pesquisar ou seja ao recuperar, apenas recupera o ultimo elemento da array na qual eu introduzi no teclado o primeiro e o segundo n é recuperado…

Classe para recuperar elemento do vetor:

/* Metodo da interface que ira returnar */
	@Override
	public Contacto returnContact(String nomeContacto) {
		Contacto auxiContacto = new Contacto();

		for (int cont = 0; cont < vetorContacto.length; cont++) {
			vetorContacto[cont] = contacto;
			if (vetorContacto[cont].getNome().equalsIgnoreCase(nomeContacto)) {
				auxiContacto.setNome(vetorContacto[cont].getNome());
				auxiContacto.setEmail(vetorContacto[cont].getEmail());

			} else {
				auxiContacto.setNome("Não foi encontrado nenhum nome");
				auxiContacto.setEmail("Não foi encontrado nenhum email");
			}

		}
		return auxiContacto;

	}

Abaixo deixo o codigo da classe agenda inteira:

public class Agenda implements metodosContatos {
	Contacto[] vetorContacto = new Contacto[5];
	Contacto contacto = new Contacto();
	private Scanner entrada = new Scanner(System.in);
	String resp;

	@Override
	public void addContact() {
		String auxiNome = "", auxiEmail = "";

		for (int cont = 0; cont < vetorContacto.length; cont++) {
			vetorContacto[cont] = contacto;

			System.out.print("Insira o nome do contacto na posição " + cont + " : ");
			auxiNome = entrada.next();
			vetorContacto[cont].setNome(auxiNome);

			System.out.print("Insira o e-mail do contacto " + cont + " : ");
			auxiEmail = entrada.next();
			vetorContacto[cont].setEmail(auxiEmail);

			System.out.println("\nQuer adicionar mais algum contacto?");
			resp = entrada.next();
			
			if (resp.equalsIgnoreCase("n")) {
				System.out.println("\nFaltam mais " + (vetorContacto.length - (cont + 1)) + " posições do vetor");
				break;
			}
			
			if (vetorContacto[4] != null) {
				System.out.println("Não é possivel adicionar mais contactos porque o vetor apenas tem " + vetorContacto.length + " posições");
				break;
				
			}
			
			
		}
		
	}

	/* Metodo da interface que ira returnar */
	@Override
	public Contacto returnContact(String nomeContacto) {
		Contacto auxiContacto = new Contacto();

		for (int cont = 0; cont < vetorContacto.length; cont++) {
			vetorContacto[cont] = contacto;
			if (vetorContacto[cont].getNome().equalsIgnoreCase(nomeContacto)) {
				auxiContacto.setNome(vetorContacto[cont].getNome());
				auxiContacto.setEmail(vetorContacto[cont].getEmail());

			} else {
				auxiContacto.setNome("Não foi encontrado nenhum nome");
				auxiContacto.setEmail("Não foi encontrado nenhum email");
			}

		}
		return auxiContacto;

	}

	/* Metodo que ira excluir um contacto */
	@Override
	public Contacto deleteContact(String nomeContacto) {
		for (int cont = 0; cont < vetorContacto.length; cont++) {
//			vetorContacto[cont] = new Contacto();
			if (vetorContacto[cont].getNome().equals(nomeContacto)) {
				vetorContacto[cont].setEmail(null);
				vetorContacto[cont].setNome(null);
				System.out.println("Contacto excluido com sucesso!");
				break;
			} else if (vetorContacto[cont].getNome() == null) {
				System.out.println("O contacto nao existe");
			}
		}
		

		return contacto;
	}

	/* Metodo que controla as funcionalidades de inserir, retornar e excluir */
	@SuppressWarnings("resource")
	public void main() {
		Contacto contacto = new Contacto();
		Scanner input = new Scanner(System.in);
		String resp;
		boolean fim = false;

		while (!fim) {
			System.out.println("-------- 7º Ultimo exercicio --------\n");
			System.out.println("Escolha uma das opções");
			System.out.println("A. Adicionar contactos (Obrigatorio caso não tenha adicionado)");
			System.out.println("B. Procurar contacto por nome (Apenas se já tiver adicionado algum contacto)");
			System.out.println("C. Excluir contacto (Apenas se já tiver adicionado algum contacto)");

			resp = input.next();
			boolean sair = false;

			while (!sair) {
				switch (resp) {
				case "a":
				case "A":
					addContact();
					sair = true;
					break;

				case "b":
				case "B":
					boolean pararRepeticao = false;
					while (!pararRepeticao) {
						System.out.println("Qual o nome do contacto que pretende retornar?");
						String auxi = input.next();
						contacto = returnContact(auxi);
						System.out.print("Nome do contacto: " + contacto.getNome() + "\nEmail do contacto: "
								+ contacto.getEmail() + "\n");

						System.out.println("Deseja repetir a pesquisa?S-(Sim) ou N-(Não)");
						auxi = "";
						auxi = input.next();
						switch (auxi) {
						case "s":
						case "S":
							pararRepeticao = false;
							break;
						case "N":
						case "n":
							pararRepeticao = true;
							sair = true;
							break;
						default:
							System.out.println("Resposta invalida");
							pararRepeticao = true;
							sair = true;
							break;
						}
					}
					break;

				case "c":
				case "C":
					boolean pararRep = false;
					while (!pararRep) {
						System.out.println("Qual o contacto que pretende excluir? Digite o nome");
						String auxiExclusao = input.next();
						deleteContact(auxiExclusao);

						System.out.println("Pretende excluir mais algum contacto?");
						auxiExclusao = entrada.next();
						switch (auxiExclusao) {
						case "S":
						case "s":
							pararRep = false;
							break;

						case "N":
						case "n":
							pararRep = true;
							sair = true;
							break;

						default:
							System.out.println("Resposta invalida");
							pararRep = true;
							break;
						}

					}
					break;

				default:
					System.out.println("Resposta não é válida");
					break;
				}
			}

		}
	}

}

Alguma ajudinha?

S

Inverte o seu if
Primeiro testa se o nome é null
Depois testa se O nome é equals o parâmetro.

Outra coisa, você não está removendo do vetor, você só está setando as propriedades com null

A

Como poderei remover do vetor??

S

Bem, não se remove algo de vetores, pois eles são imutáveis.
O que você pode fazer é criar um novo vetor, com uma posição a menos e fazer a variável referenciar ele.

Ex:

public class RemoverDoArray {

    private static int[] vetor = {0, 1, 2, 3, 4, 5, 6, 7, 8, 9};

    public static void main(String[] args) {

        for (int num : vetor) {
            System.out.print(num + ".. ");
        }

        System.out.println("\n==================================");
        remove(9);

        for (int num : vetor) {
            System.out.print(num + ".. ");
        }
    }

    public static void remove(int y) {
        int[] vetorAux = new int[vetor.length - 1];

        for (int i = 0; i < vetor.length; i++) {
            if (vetor[i] == y) {
                continue;
            }
            vetorAux[i] = vetor[i];
        }
        vetor = vetorAux;

    }

}

Resultado:
Screenshot_2

S

Vetores não são imutáveis, eles não são redimensionáveis.

Para remover um elemento de um vetor é só atribuir null ao índice desejado.

S

Realmente, erro meu, desculpa.
Da próxima vez presto mais atenção ao contexto todo.

Criado 6 de junho de 2020
Ultima resposta 15 de jun. de 2020
Respostas 12
Participantes 4