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