Problema com if

6 respostas
lalau

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" );
		}
	 }
	}

6 Respostas

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:

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
}

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.

G

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.

ViniGodoy

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).

ViniGodoy

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.

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ó.

lalau
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:

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
}

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.

"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.

ViniGodoy

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.

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;
Criado 7 de julho de 2012
Ultima resposta 7 de jul. de 2012
Respostas 6
Participantes 3