Comparação de String

Estou com um problema.

O código é simples.

nome = JOptionPane.showInputDialog("Login:"); while (!nome.equals(cliente[i].nome)|| i > 2){ i++; }

Se eu digito as nomes corretas ele passa, mas se eu digitar a errada aparece essa mensagem:
“Exception in thread “main” java.lang.ArrayIndexOutOfBoundsException: 3”
Só que eu já deixei que se a variavel “i” for maior 2 ele também sai. Não entendo o porque não está acontencendo

/edit
Pelo o que eu entendi, o while não está conseguindo considerar o “i > 2” para sair do laço.

Numa comparação or (||), basta que um dos operandos seja verdadeiro para o resultado ser considerado verdadeiro. Como quando você informa um login errado a operação:

!nome.equals(cliente[i].nome)

sempre será true. O correto seria fazer algo assim:

while (!nome.equals(cliente[i].nome) && i <= 2) {
   i++;
}

isto se 2 for o tamanho do array… acredito que seja melhor usar cliente.length!

Numa comparação or (||), basta que um dos operandos seja verdadeiro para o resultado ser considerado verdadeiro. Como quando você informa um login errado a operação:

!nome.equals(cliente[i].nome)

sempre será true. O correto seria fazer algo assim:

while (!nome.equals(cliente[i].nome) && i <= 2) {
   i++;
}

isto se 2 for o tamanho do array… melhor usar cliente.length ao invés de 2 diretamente.

nome = JOptionPane.showInputDialog("Login:"); while (!nome.equals(cliente[i].nome)&&(i<=cliente.length)){ i++; }

Eu alterei deste jeito e nada. Eu quero que uma das variaveis seja a verdadeira, não as duas, uma pra mim já basta, por isso usei o “||” ao invés de “&&”.
Mesmo assim, ele da a mesma mensagem.

OBS: o tamanho do vetor é 3

Continua dando erro porque a posição cliente.length não existe no vetor.

Tenta assim:

nome = JOptionPane.showInputDialog("Login:");
while(!nome.equals(cliente[i].nome && i < cliente.length){
i++;
}

No caso, usando client.length, atente que o operador deve ser < e não <=. Além disso você deve efetuar essa consistência antes de acessar o elemento no array:

nome = JOptionPane.showInputDialog("Login:");
while ((i<cliente.length) && !nome.equals(cliente[i].nome)){
   i++;
}

Você sempre precisa i < client.length (sempre deve ser true), caso contrário você tem um IndexArrayOutOfBoundsException.

[quote=wagnerfrancisco]No caso, usando client.length, atente que o operador deve ser < e não <=. Além disso você deve efetuar essa consistência antes de acessar o elemento no array:

nome = JOptionPane.showInputDialog("Login:");
while ((i<cliente.length) && !nome.equals(cliente[i].nome)){
   i++;
}

Você sempre precisa i < client.length (sempre deve ser true), caso contrário você tem um IndexArrayOutOfBoundsException.
[/quote]

Se eu fiz assim, acontece o que acontecia antes.
Se o nome ficar igual ao cliente[i].nome ele consegue ir, mas se não for ele continua estourando a memoria.
Exemplo:
Dados
cliente.length = 3
cliente[0].nome - Joao
cliente[1].nome - Maria
cliente[2].nome - Jose
i = 0
nome = “”

Teste

insiro nome = Jose
i = 0 é menor que cliente.length - SIM
nome é diferente de cliente[i].nome - NAO
Segue
Fim do laço

insiro nome = Maria
i = 0 é menor que cliente.length - SIM
nome é diferente de cliente[i].nome - Sim
i ++
i = 1 é menor que cliente.length - SIM
nome é diferente de cliente[i].nome - NAO
Segue
Fim do laço

insiro nome = Jose
i = 0 é menor que cliente.length - SIM
nome é diferente de cliente[i].nome - Sim
i ++
i = 1 é menor que cliente.length - SIM
nome é diferente de cliente[i].nome - SIM
i++
i = 2 é menor que cliente.length - SIM
nome é diferente de cliente[i].nome - NAO
Segue
Fim do laço

Agora se eu insiro nome = Marcos
i = 0 é menor que cliente.length - SIM
nome é diferente de cliente[i].nome - Sim
i ++
i = 1 é menor que cliente.length - SIM
nome é diferente de cliente[i].nome - SIM
i++
i = 2 é menor que cliente.length - SIM
nome é diferente de cliente[i].nome - SIM
i++
i = 3 é menor que cliente.length - NAO
Porém quando chega aqui ele deveria sair do laço do mesmo jeito, mas ele não sai e ai “IndexArrayOutOfBoundsException”

Eu só quero fazer ele sair do laço se e o i for maior que 2 (ou cliente.length que da a mesma coisa).
Como vocês podem ver ele valida se o nome for igual ao cliente[i].nome agora se não ele da pau.

Não sei se você quer assim, mas essa que é a idéia:

[code]
import javax.swing.*;

public class Teste
{
public static void main(String []args)
{
String nome = “”;
int i = 0;
String []cliente = {“João”, “Maria” , “José”};

     while (i<cliente.length && !nome.equals(cliente[i])){ 
        nome = JOptionPane.showInputDialog("Login:");  
        i++;  
     } 
  
  }//fim main()

}//fim class Teste[/code]

Obs.: Como o wagnerfrancisco informou você deve verificar e a posição i é válida para o vetor antes de acessá - la, se não você vai encontrar o erro: “Exception in thread “main” java.lang.ArrayIndexOutOfBoundsException: 3”

[quote=jc_caetano]Não sei se você quer assim, mas essa que é a idéia:

[code]
import javax.swing.*;

public class Teste
{
public static void main(String []args)
{
String nome = “”;
int i = 0;
String []cliente = {“João”, “Maria” , “José”};

     while (i<cliente.length && !nome.equals(cliente[i])){ 
        nome = JOptionPane.showInputDialog("Login:");  
        i++;  
     } 
  
  }//fim main()

}//fim class Teste[/code]

Obs.: Como o wagnerfrancisco informou você deve verificar e a posição i é válida para o vetor antes de acessá - la, se não você vai encontrar o erro: “Exception in thread “main” java.lang.ArrayIndexOutOfBoundsException: 3”[/quote]

Bem parecido, a idéia seria:

[code]
import javax.swing.*;

public class Teste
{
public static void main(String []args)
{
String nome = “”;
int i = 0;
String []cliente = {“João”, “Maria” , “José”};

     nome = JOptionPane.showInputDialog("Login:");
     while (i<cliente.length && !nome.equals(cliente[i])){ 
         i++;  
     } 

     if (nome.equals(cliente[i])){
         //Faça uma coisa
     } else {
         //Faça outra coisa
     }

  }//fim main()

}//fim class Teste[/code]

A variavel “nome” tem que estar fora do while, porque se estiver dentro, ele não ve todas as posições do “cliente[i]” para ver se vai validar ou não. O problema é que ao ver todas as posições se o nome não estiver correto ele continua aumentando o valor de “i” e acaba dando “IndexArrayOutOfBoundsException”, é por isso que eu estou pedindo não entendo, mesmo que eu coloque “|| i>cliente.length” ele estoura, alias já tentei colocar “se i>1” ele passa e estoura do mesmo jeito.

Acabei resolvendo o problema.

nome = JOptionPane.showInputDialog("Login:"); while (i<2 && !nome.equals(cliente[i].nome)){ i++; }

O tamanho do “i” tinha que ir até 2 porque ele soma depois, ai quando ia fazer a verificação ele procurava pelo valor cliente[3].nome sempre e acabava dando aquele erro.
Eu sou um animal, tava na cara e eu não vi.

Obrigado pela ajuda!!

Mas você não precisa fazer a comparação com o nome duas vezes. Veja:

 
 import javax.swing.*;  

  public class Teste
   {
      public static void main(String []args)
      {
         String nome = "";
         int i = 0;
         String []cliente = {"João", "Maria" , "José"};

         nome = JOptionPane.showInputDialog("Login:");
         while (i<cliente.length && !nome.equals(cliente[i])){ 
             i++;  
         }

         /* vc comparou os elementos no loop acima, agora simplesmente veja se o elemento foi encontrado */
         if (i != cliente.length) {
             //Elemento encontrado, faça alguma coisa.
         } else {
             //Elemento não encontrado, faça outra coisa.
         }

      }//fim main()
   
   }//fim class Teste

Do modo que vc fez, vc sempre faz cliente[i].equals(nome) duas vezes…