Problema com if

pessoal tenho este codigo ele funciona porem quando quero apagar algo que não se encontra no vector ele não retorna a informação que devia por favor dem uma luz.

public void apagarProduto(String nome)
	{
	 Produto p;

	 if(nome.equals(""))
		 JOptionPane.showMessageDialog(null, "Por favor digite o nome do producto no campo nome");

	 else
	 {
		if(!nome.equals("")){
		  for(int i = 0; i < produto.size(); i++)
		  {
			 p = produto.get(i);
			 if(p.nome.equals(nome))
			 {
				produto.removeElementAt(i);
				area.append("\nApagou da lista o produto " + nome);
				i = produto.size();
			 }
		  }
		}
		else
		{	
		  JOptionPane.showMessageDialog(null, "\nO produto " + nome + " não consta na lista\n" );
		}
	 }
	}

Seu código está totalmente errado.
Primeiramente, você não pode mexer na lista enquanto itera sobre ela, a menos que esteja usando um iterator. Depois, você não pode simplesmente achar que um produto não foi encontrado, só porque o if falhou na primeira vez. Seria necessário testar se o código entrou naquele if alguma vez.

Finalmente, o código está tem algumas redundâncias. Por exemplo, você já testa se o nome.equals(""), portanto, não precisa testar novamente a condição inversa no else.

O correto seria algo assim:

[code]public Produto apagarProduto(String nome) {
//Deixe a interface gráfica capturar a exceção e exibir a mensagem
if(nome == null || nome.isEmpty())
throw new IllegalArgumentException(“Por favor, digite o nome do producto no campo nome!”);

Iterator&lt;Produto&gt; it = produto.iterator();
while (it.hasNext()) {
    Produto p = it.next();
    if (nome.equals(p.nome)) {
            it.remove(); //Maneira certa de remover enquanto percorre
            return p; //Retorna o produto removido
    }
}
return null; //Produto não removido

}[/code]

Note que esse método retorna o produto removido, ou nulo, caso nenhum produto tenha sido removido. Portanto, fica a cargo da sua interface gráfica adicionar o resultado ao JTextArea, ou dar uma mensagem de que nenhum produto foi removido.

Para que seu código não fique confuso é importante não misturar código de interface gráfica com código da lógica do seu sistema. Além disso, procure usar corretamente o JOptionPane. O primeiro parâmetro dele exige a janela que está abrindo o JOptionPane e não null, como vc está passando.

uma maneira q tb pode ser usada pra iterar numa lista e remover elementos da mesma nessa iteracao, é fazendo iteracao inversa.

   for(int i =  produto.size(); i > 0; i--)  
   {  
         if(produto.get(i).IsInativo())  
            produto.removeElementAt(i);  
    }  

outra coisa, vejo mt isso:
i = produto.size();

pra fazer sair do loop.
pra q existe o break?
alem de mais elegante, fica mais legível.

Desde que a lista seja um ArrayList ou um Vector.
Caso contrário, os códigos usando get() terão uma performance deplorável (seja com iteração reversa ou não).

[quote=GilsonNunes]outra coisa, vejo mt isso:
i = produto.size();

pra fazer sair do loop.
pra q existe o break?
alem de mais elegante, fica mais legível.[/quote]

Boa observação. Na minha resposta original, esse detalhe passou batido.
Editei ali para levar em consideração a remoção de um produto só.

[quote=ViniGodoy]Seu código está totalmente errado.
Primeiramente, você não pode mexer na lista enquanto itera sobre ela, a menos que esteja usando um iterator. Depois, você não pode simplesmente achar que um produto não foi encontrado, só porque o if falhou na primeira vez. Seria necessário testar se o código entrou naquele if alguma vez.

Finalmente, o código está tem algumas redundâncias. Por exemplo, você já testa se o nome.equals(""), portanto, não precisa testar novamente a condição inversa no else.

O correto seria algo assim:

[code]public Produto apagarProduto(String nome) {
//Deixe a interface gráfica capturar a exceção e exibir a mensagem
if(nome == null || nome.isEmpty())
throw new IllegalArgumentException(“Por favor, digite o nome do producto no campo nome!”);

Iterator&lt;Produto&gt; it = produto.iterator();
while (it.hasNext()) {
    Produto p = it.next();
    if (nome.equals(p.nome)) {
            it.remove(); //Maneira certa de remover enquanto percorre
            return p; //Retorna o produto removido
    }
}
return null; //Produto não removido

}[/code]

Note que esse método retorna o produto removido, ou nulo, caso nenhum produto tenha sido removido. Portanto, fica a cargo da sua interface gráfica adicionar o resultado ao JTextArea, ou dar uma mensagem de que nenhum produto foi removido.

Para que seu código não fique confuso é importante não misturar código de interface gráfica com código da lógica do seu sistema. Além disso, procure usar corretamente o JOptionPane. O primeiro parâmetro dele exige a janela que está abrindo o JOptionPane e não null, como vc está passando.[/quote]

“Não misturar codigo de GUI e logica” poderia dar uma dica ?
Muito grato pelas correções e dicas acima de tudo a sinceridade, vejo que tenho muito por estudar pois sou novo no mundo java e grato pela atenção e prontidão.

[quote=lalau]“Não misturar codigo de GUI e logica” poderia dar uma dica ?
Muito grato pelas correções e dicas acima de tudo a sinceridade, vejo que tenho muito por estudar pois sou novo no mundo java e grato pela atenção e prontidão.
[/quote]

Note que o código que postei não está preocupado em exibir mensagens para o usuário.
Ele apenas faz a exclusão e retorna informação suficiente para que uma interface gráfica dê essas mensagens.

Foi isso que eu quis dizer:

  • Separe seu código em partes lógicas: Algumas trabalham com dados, outras gravam dados no disco, outras exibem coisas para o usuário;
  • Procure aprender sobre os conceitos de encapsulamento e divisão de camadas;