Excluir Item

Pessoal… boa tarde… estou com um probleminha neste código…
Se eu mandar excluir o primeiro de cara(número 4)… aparece a mensagem lista vazia 2 vezes… e após eu inserir algo e apertar a tecla de excluir primeiro (número 4)pela 2º vez ele da erro…

a exclusão do ultimo elemento a principio funiona…
Obs: a tecla 4 funcionava até eu inserir a tecla 5… que é para excluir o ultimo elemento


import javax.swing.JOptionPane;
public class Aluno
{
	String nome;
	int RA;
	
	void ler()
	{
		nome = JOptionPane.showInputDialog("Digite nome: ");
		RA = Integer.parseInt(JOptionPane.showInputDialog("Ra: "));
	}
	public boolean equals(Object ch)
	{
		String chave = (String)ch;
		return nome.equals(chave);
	}
	public String toString ()
	{
		return "\n Nome : " + nome + "\n Ra : " + RA;
	}
}


public class Lista
{
	private class Celula
	{
		Object item;
		Celula prox;
	}
	Celula primeiro;
	Celula ultimo;
	Celula pos;

	public Lista ()
	{
		primeiro = new Celula();
		primeiro.item = null;
		primeiro.prox = null;
		ultimo = primeiro;
		pos = primeiro;
	}
	public void insere (Object novo)
	{
		ultimo.prox = new Celula();
		ultimo = ultimo.prox;
		ultimo.item = novo;
		ultimo.prox = null;
	}
	public void imprime()
	{	
		if (vazia())
		{
			System.out.println("Lista Vazia");
		}
		else
		{
	
			String s = "Lista: \n ";
			for (Celula p = primeiro.prox; p!=null; p = p.prox)
			{
					{
						s = s + p.item.toString() + "\n";
					}
			}
			System.out.println(s);
		}
	}
	public Object pesquisa(Object chave)
	{
		if(vazia () || chave ==null)
		{
			return null;
		}
		for(Celula p = primeiro.prox;p!=null;p=p.prox)
		{
			if(p.item.equals(chave))
			{
				return p.item;
			}
		}
		return null;

	}
	public boolean vazia()
	{
		if (primeiro == ultimo)
		{
			return true;
		}
		else
		{
			return false;
		}
	}
	public Object exclui(Object chave)
	{
		if (vazia () || chave == null) return null;
			Object itemRetornar = null;
			for (Celula p=primeiro;p!=ultimo;p=p.prox)
			{
				if(p.prox.item.equals(chave))
				{	itemRetornar = p.prox.item;
					if(ultimo == p.prox) ultimo =p;
					p.prox = p.prox.prox;
					break;
				}
			}
		return itemRetornar;
	}

	public Object ExcluiPrimeiro()
	{
		if(vazia())return null;
		{
			Object itemRetornar = primeiro.prox.item;
			primeiro.prox=primeiro.prox.prox;
			return itemRetornar;
		}
	}
	public Object ExcluiUltimo()
	{//	while(ultimo.item==primeiro)
		
		{
			Object itemRetornar = ultimo.item;
			ultimo=pos;
			ultimo.prox = null;
			return itemRetornar;
			
		}
	}

}

______________________________________
import javax.swing.JOptionPane;
public class TesteLista
{
	public static void main (String [] arqs)
	{
		Lista L = new Lista();
		int opcao;


		do
		{
			String menu = "Escolha : \n 1. Inserir  \n 2. Imprimir \n 3. Pesquisar \n 4. Excluir Primeiro \n 5. Exluir Ultimo \n Aperte o 9 para sair..";
			opcao = Integer.parseInt(JOptionPane.showInputDialog(menu));

			switch(opcao)
			{
				case 1:
				{
					Aluno a = new Aluno();
					a.ler();
					L.insere(a);
					break;
				}
				case 2:
				{
					L.imprime();
					break;
				}
				case 3:
				{
					String n = JOptionPane.showInputDialog("Nome a pesquisar: ");
					Aluno a = (Aluno)L.pesquisa(n);
					if (a==null)
					{
						System.out.println("Não existente...");
					}
					else
					{
						System.out.println("Nome pesquisado foi : " + a);
					}
					break;
				}
				case 4:
				{
				     Aluno a = (Aluno)L.ExcluiPrimeiro();
				     if(a!=null)
				     {	
				     	System.out.println("Item excluido é :" + a);
				     	break;
				     }
					     else
					     {
					     	System.out.println("lista vazia");
					     }
				}
				case 5:
				{
					 Aluno a = (Aluno)L.ExcluiUltimo();
					 if (a!=null)
					 {
					 	 System.out.println("Item excluido é :" + a);
				    	 break;
					 }
				    	 else
				    	 {
				    	 	System.out.println("lista vazia");
				    	 }
					 	
				}

			}
		}while(opcao!=9);
	}

}

Alguém pra da uma dica ??? :?:

Esta aparecendo lista vazia 2 vezes devido não ter break no else do case 4.

[code]
case 4:
{
Aluno a = (Aluno)L.ExcluiPrimeiro();
if(a!=null)
{
System.out.println(“Item excluido é :” + a);
break;
}
else
{
System.out.println(“lista vazia”);
break;
}
}
case 5:
{
Aluno a = (Aluno)L.ExcluiUltimo();
if (a!=null)
{
System.out.println(“Item excluido é :” + a);
break;
}
else
{
System.out.println(“lista vazia”);
break;
}

            }   [/code]

Arrumei este ponto e testei ak, não tive problema de inserir e excluir.
Abraços

Boa tarde, Davidps!

Faça os case 4 e 5 com o break fora do if, assim:

case 4: { Aluno a = (Aluno)L.ExcluiPrimeiro(); if(a!=null) { System.out.println("Item excluido é :" + a); } else { System.out.println("lista vazia"); } break; } case 5: { Aluno a = (Aluno)L.ExcluiUltimo(); if (a!=null) { System.out.println("Item excluido é :" + a); } else { System.out.println("lista vazia"); } break; }
Isso fará parar de imprimir duas vezes, pois o break não está funcionando no caso do else, está imprimindo duas vezes pois imprime do case 4 e do case 5.

Abraço!

Bom, quanto ao outro erro:

Vamo supor que eu adicione 2 alunos a lista, se eu excluo esses alunos usando a opção 4 duas vezes, na próxima vez lança uma NullPointerException:

Exception in thread "main" java.lang.NullPointerException at Lista.ExcluiPrimeiro(Lista.java:92) at TesteLista.main(TesteLista.java:45)

Fazendo uns teste cheguei a conclusão de que ao excluir, ainda está ficando a Celula e por isso não estão recebendo true no método vazia(). Já que não está recebendo true ele tenta mais uma vez acessar primeiro.prox.item que não existe mais e gera um erro.

Para constatar isso fiz o seguinte: if(vazia())return null; { System.out.print("TESTE "+primeiro); // Para fazer meu teste Object itemRetornar = primeiro.prox.item; primeiro.prox=primeiro.prox.prox; return itemRetornar; } }
Faça isso para ver que após excluir todos ainda assim fica uma Celula vazia, sem Celula prox e sem Celula Item.

Abraço e boa sorte!

Pessoal…

Consegui fazer parar de aparecer 2 vezes… e fiz o teste do Vingdel …

nesse caso… vocês acham que devo fazer um for para percorerr ? ou alteração simples no ExcluirUltimo() ??

No metodo imprimir tem um for… devo altera-lo ??

[quote=Davidps]Pessoal…

Consegui fazer parar de aparecer 2 vezes… e fiz o teste do Vingdel …

nesse caso… vocês acham que devo fazer um for para percorerr ? ou alteração simples no ExcluirUltimo() ??

No metodo imprimir tem um for… devo altera-lo ??
[/quote]

Então, era só a posição do break mesmo que tava fazendo imprimir duas vezes, ne?!

Pois é cara, na verdade acho que a modificação que você tem que fazer é no método ExcluirPrimeiro(), pois é onde está gerando o erro, tenta fazer nos moldes do ExcluirUltimo(), pois ele parece estar certinho.

Não parei para debugar teu código, só estou analisando via Notepad, como sempre faço quando estou aqui no GUJ, porém acho que você deve analisar seu código mais a fundo.

Eu achei bastante confuso e acho que pode ficar mais simples, realmente não consegui acompanhar sua lógica de raciocínio.

Abraço e boa sorte!