Pequeno erro na hora de compilar

9 respostas
H

Olá, estou fazendo uma lista de JAVA e como iniciei a pouco tempo estou com um pequeno problema na hora da compilação, irei marcar o local do erro.

Classe Main
import java.sql.Date;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Calendar;
import java.util.List;
import java.util.Scanner;

public class Main {
	static List<Contato> listaContatos = new ArrayList<>();
	static int verificar;

	public static int checar(Long id, int verificar) {
		for (int i = 0; i < listaContatos.size()+1; i++) {
			if (listaContatos.get(i).getId() == id) {    <================== /*O erro é aqui*/
				verificar = i;

			} else
				verificar = -1;

		}
		return verificar;

	}

	public static void main(String[] args) throws Throwable {
		int opcao = 0;
		while (opcao != 4) {
			System.out.println("********MENU********");
			System.out.println("1 - Adicionar novo contato");
			System.out.println("2 - Listar todos os contatos");
			System.out.println("3 - Excluir contato");
			System.out.println("4 - Sair do programa");
			System.out.println("*********************");
			System.out.println("Entre com um comando: ");
			Scanner s = new Scanner(System.in);
			opcao = s.nextInt();

			switch (opcao) {
			case 1:
				System.out.println("Adicionar novo contato");
				while (verificar != -1) {
					System.out.println("Entre com ID: ");
					Long id = s.nextLong();

					verificar = checar(id, verificar);
				}
				System.out.println("Entre com nome: ");
				String nome = s.next();
				System.out.println("Entre com telefone: ");
				String fone = s.next();
				System.out.println("Entre com Data de nascimento: ");
				String dataNascimento = s.next();
				Date date = (Date) new SimpleDateFormat("dd/MM/yyyy")
						.parse(dataNascimento);
				Calendar dataNasc = Calendar.getInstance();
				dataNasc.setTime(date);
				Contato novo = new Contato();
				listaContatos.add(novo);

				break;
			case 2:
				System.out.println("Lista de todos os contatos: ");
				for (Contato contato : listaContatos) {
					System.out.println(listaContatos.toString());

				}
				break;
			case 3:
				while (verificar == -1) {
					System.out.println("Usuário nao existe");
					System.out.println("Entre com ID valido: ");
					Long excluir = s.nextLong();
					checar(excluir, verificar);
				}
				listaContatos.remove(verificar);

				break;

			default:
				System.out.println("Comando inválido");

			}

		}
	}
}
Classe Contato
import java.util.Calendar;


public class Contato {
	private Long id;
	private String nome;
	private String telefone;
	private Calendar dataNascimento;

	public Long getId() {
		return id;
	}

	public void setId(Long id) {
		this.id = id;
	}

	public String getNome() {
		return nome;
	}

	public void setNome(String nome) {
		this.nome = nome;
	}

	public String getTelefone() {
		return telefone;
	}

	public void setTelefone(String telefone) {
		this.telefone = telefone;
	}

	public Calendar getDataNascimento() {
		return dataNascimento;
	}

	public void setDataNascimento(Calendar dataNascimento) {
		this.dataNascimento = dataNascimento;
	}

	@Override
	public String toString() {
		return "Contato [id=" + id + ", nome=" + nome + ", telefone="
				+ telefone + ", dataNascimento=" + dataNascimento + "]";
	}

}

Desde já, obrigado.

9 Respostas

Hebert_Coelho

E qual é o erro?

BrunoFurtado

Cara, sei lá…
Mas batendo o olho ai eu tiraria esse +1 do cabeçalho do for.
Sinceramente, n vejo necessidade.

Imaginando o que rola…
A tua lista pode ter tamanho 0, ou seja, n tem objetos.
O código sempre vai passar por ali, pois vai existir no minimo 1.
Ao tentar pegar o primeiro objeto da lista vai rolar erro pois a lista n tem nenhum objeto (ArrayIndexOutOfBounds…).

// linha 13
for (int i = 0; i < listaContatos.size()+1; i++) {  

// substituir por
for (int i = 0; i < listaContatos.size(); i++) {
H
BrunoFurtado:
Cara, sei lá... Mas batendo o olho ai eu tiraria esse +1 do cabeçalho do for. Sinceramente, n vejo necessidade.

Imaginando o que rola...
A tua lista pode ter tamanho 0, ou seja, n tem objetos.
O código sempre vai passar por ali, pois vai existir no minimo 1.
Ao tentar pegar o primeiro objeto da lista vai rolar erro pois a lista n tem nenhum objeto (ArrayIndexOutOfBounds...).

// linha 13
for (int i = 0; i < listaContatos.size()+1; i++) {  

// substituir por
for (int i = 0; i < listaContatos.size(); i++) {

O erro continua.
Ele simplesmente entra em um loop infinito =T

********MENU********
1 - Adicionar novo contato
2 - Listar todos os contatos
3 - Excluir contato
4 - Sair do programa
*********************
Entre com um comando:
1
Adicionar novo contato
Entre com ID:
2
Entre com ID:
3
Entre com ID:
4
Entre com ID:
5
Entre com ID:
6
Entre com ID:
7
Entre com ID:
8
Entre com ID:
0
Entre com ID:
-1

BrunoFurtado

Cara,
Ao incluir o contato, vc n esta adicionado na lista…
A lista ta sempre zerada; n vai entrar no for; n vai comparar; nunca vai ser -1.

To falando as coisas aqui, mas olhando cara…
Veja ai no compilador se é isso msmo.

H

BrunoFurtado:
Cara,
Ao incluir o contato, vc n esta adicionado na lista…
A lista ta sempre zerada; n vai entrar no for; n vai comparar; nunca vai ser -1.

To falando as coisas aqui, mas olhando cara…
Veja ai no compilador se é isso msmo.

Problema eh que ele nao chega nem a sair do id, logo n dah pra continuar a adicionar.

BrunoFurtado

No chegar…
Se tam. lista for 0 retorna -1.

Cara, tem varios erros de logica ai…
Reveja esse fonte.

J

Acredito que seu método checar, seja para verificar se o ID já existe.

Refiz ele:

public static boolean checar(Long id) {
		for (int i = 0; i < listaContatos.size(); i++) {
			if (listaContatos.get(i).getId() == id)
				return true;
		}
		return false;
	}

Linhas 57 e 58 de seu código:

Contato novo = new Contato();  
                listaContatos.add(novo);

Onde você atribuiu os valores capturados do teclado ao seu contato?

Fiz a alteração do construtor na classe Contato, acrescentei o construtor default e o recebendo parâmetros, ficando assim:

public Contato() {}
	
	public Contato(Long id, String nome, String telefone, Calendar dataNascimento){
		this.id = id;
		this.nome = nome;
		this.telefone = telefone;
		this.dataNascimento = dataNascimento;
	}

Fazendo isso, alterei a linha 57 da classe Main para:

Contato novo = new Contato(id, nome, fone, dataNasc);

Uma outra coisa que notei, é que você está utilizando o java.sql.Date e não o java.util.Date, é para ser isso mesmo?

Além de ter alterado a linha 57, alterei o CASE 1, de seu SWITCH da classe Main para:

case 1:
				System.out.println("Adicionar novo contato");
				System.out.println("Entre com ID: ");
				Long id = s.nextLong();
				
				if (!checar(id)) {
					System.out.println("Entre com nome: ");
					String nome = s.next();
					System.out.println("Entre com telefone: ");
					String fone = s.next();
					System.out.println("Entre com Data de nascimento: ");
					String dataNascimento = s.next();
					Date date = (Date) new SimpleDateFormat("dd/MM/yyyy")
							.parse(dataNascimento);
					Calendar dataNasc = Calendar.getInstance();
					dataNasc.setTime(date);
					Contato novo = new Contato(id,nome,fone,dataNasc);
					listaContatos.add(novo);
				} else {
					System.out.println("ID Já existente");
				}
				break;

Espero ter ajudado.

H

É eu consegui alterar semelhante ao que você disse.
Realmente não tava adicionando o ID, Nome, Telefone, etc…

Agora estou enfrentando 2 problemas.

1º - Na hora da exibir a lista, ela vem duplicada.
2º - O remover não está removendo :frowning:

J

Compare o código abaixo para imprimir com o seu.

case 2:
				System.out.println("Lista de todos os contatos: ");
				for (Contato contato : listaContatos) {
					System.out.println(contato.toString());

				}
				break;

Para exclusão, é possível fazer dessa maneira:

case 3:
				System.out.println("Código a ser excluído");
				Long excluir = s.nextLong();
				if (checar(excluir)){
					for (int i = 0; i < listaContatos.size(); i++){
						if (listaContatos.get(i).getId() == excluir){
							listaContatos.remove(i);
						}
					}
				
				}
Criado 18 de janeiro de 2013
Ultima resposta 18 de jan. de 2013
Respostas 9
Participantes 4