[RESOLVIDO] Erro " java.lang.ArrayIndexOutOfBoundsException: -1"

Galera, estou criando um projeto de jogo da velha.
Nesse projeto existe o arquivo JogoDaVelha.java onde tem o construtor e os metodos.
Existe o arquivo TesteJogo.java onde executo o codigo.
Criei um tabuleiro utilizando swing.
O tabuleiro foi criado a partir de um for dentro de outro for, utilizando uma matriz de JLabels. Utilizei o swing tambem para deixar cm uma carinha legal. Ao executa-lo, ao clicar em alguma das celulas, apresenta o seguinte erro. Se alguem puder me dar uma luz fico muito grata.

Exception in thread “AWT-EventQueue-0” java.lang.ArrayIndexOutOfBoundsException: -1

at JogoDaVelha.jogarJogador(JogoDaVelha.java:94)
at Tabuleiro$2.mouseClicked(Tabuleiro.java:127)
at java.awt.Component.processMouseEvent(Unknown Source)
at javax.swing.JComponent.processMouseEvent(Unknown Source)
at java.awt.Component.processEvent(Unknown Source)
at java.awt.Container.processEvent(Unknown Source)
at java.awt.Component.dispatchEventImpl(Unknown Source)
at java.awt.Container.dispatchEventImpl(Unknown Source)
at java.awt.Component.dispatchEvent(Unknown Source)
at java.awt.LightweightDispatcher.retargetMouseEvent(Unknown Source)
at java.awt.LightweightDispatcher.processMouseEvent(Unknown Source)
at java.awt.LightweightDispatcher.dispatchEvent(Unknown Source)
at java.awt.Container.dispatchEventImpl(Unknown Source)
at java.awt.Window.dispatchEventImpl(Unknown Source)
at java.awt.Component.dispatchEvent(Unknown Source)
at java.awt.EventQueue.dispatchEventImpl(Unknown Source)
at java.awt.EventQueue.access$500(Unknown Source)
at java.awt.EventQueue$3.run(Unknown Source)
at java.awt.EventQueue$3.run(Unknown Source)
at java.security.AccessController.doPrivileged(Native Method)
at java.security.ProtectionDomain$JavaSecurityAccessImpl.doIntersectionPrivilege(Unknown Source)
at java.security.ProtectionDomain$JavaSecurityAccessImpl.doIntersectionPrivilege(Unknown Source)
at java.awt.EventQueue$4.run(Unknown Source)
at java.awt.EventQueue$4.run(Unknown Source)
at java.security.AccessController.doPrivileged(Native Method)
at java.security.ProtectionDomain$JavaSecurityAccessImpl.doIntersectionPrivilege(Unknown Source)
at java.awt.EventQueue.dispatchEvent(Unknown Source)
at java.awt.EventDispatchThread.pumpOneEventForFilters(Unknown Source)
at java.awt.EventDispatchThread.pumpEventsForFilter(Unknown Source)
at java.awt.EventDispatchThread.pumpEventsForHierarchy(Unknown Source)
at java.awt.EventDispatchThread.pumpEvents(Unknown Source)
    at java.awt.EventDisp*atchThread.pumpEvents(Unknown Source)
at java.awt.EventDispatchThread.run(Unknown Source)[Link do projeto completo](https://github.com/raissahonorato/jogodavelha/tree/master/JogoDaVelha/src)

Posta seu código para gente encontrar o erro.
Mas o erro é que em alguma Array sua você esta tentando acessar uma posição que não existe.

2 curtidas

Bom dia Raissa_Honorato, exatamente o que o amigo @Vinicius_Salles esta ressaltando, você esta acessando uma posição 54 por exemplo de um array que so tem 53 posições. Um erro muito comum é declarar um array com tamanho 50 por exemplo e esquecer que o indice começa em Zero(0) e vai até 49.
Esse erro é provavel que voce ache em JogoDaVelha.java linha 94 ou em Tabuleiro.java linha 127

Abraços
Max

1 curtida

Eu postei o link do projeto, acho que ficoui meio escondido desculpa. rss Eu mexi com relacao ao tamanho do array, mas o erro continua.

Segue o link do projeto completo.

O problema pode estar na hora de passar os valores.

Dá um sout aqui pra ver o que retorna:
JLabel b = (JLabel) e.getSource();
System.out.println(b);

E tenta passar outro valor no lin e no col
boolean jogadavalida = jogo.jogarJogador(numeroJogador, 3, 3);

Se funcionar o problema está na hora de passar os valores mesmo.

Eu percebi que os arquivos estao enxergando a matriz da seguinte forma como mostra a imagem, por isso as posicoes nao batem na hora da execução. Se eu fizer um Tabuleiro via swing independente do arquivo JogoDaVelha, nao da problema nenhum, justamente pq nao da choque com a matriz do outro arquivo. Capturar

Entenda, se o jogador ta selecionando a posição 1,1 você deve marcar a posição 0,0 da matriz.
Porque Array na maioria das linguagens começam na posição 0,0.

É exatamente isso, @Raissa_Honorato. Isso acontece porque o Java (de modo geral) é zero-based, o que significa que a primeira posição da estrutura de dados é o zero. Assim sendo, sua matriz (na memória) tem essas posições:

  0  1   2
0  |   | 
1  |   |
2  |   |

E você está enxergando dessa forma:

  1  2   3
1  |   | 
2  |   |
3  |   |

Pro usuário final, a segunda forma é o que ele verá, mas “debaixo dos panos” se usa a primeira forma.

Espero que tenha esclarecido!

[]'s

Obrigada pelas dicas, me ajudaram bastante. Tenho so mais uma duvida, mas nao envolve o Swing do projeto. Na hora de imprimir a matriz, antes de colocar os valores “X” e “O”, aparece “null”, como posso substituir o null por um espaço em branco? Segue imagem e o for que utilizei pra criar a matriz.! Ah, é em string a matriz [kjds

Você pode fazer da seguinte forma:

System.out.println(matriz[i][j] != null ? matriz[i][j]+" | " : " | ");

Operador ternário funciona assim:

teste lógico ? executa se for verdadeiro : executa se for falso;

Seguindo o exemplo que escrevi, eu testo se a matriz na posição [i][j] é diferente de nulo, caso seja, então eu exibo o valor contido na posição, caso contrário exibo somente o espaço em branco.

Operador ternário é bem simples de compreender a sintaxe e de usar, geralmente ele é bastante usado em situações simples como a sua, com ele evitamos de ter um if/else para resolver o problema, diminuímos a quantidade de código e aumentamos a praticidade.

Espero que tenha compreendido, qualquer dúvida que surja é só perguntar!

2 curtidas

Acho que seria válido aqui você dar uma breve explicação da linha para ela, cara. Operador ternário foge da realidade do ensino básico do Java, e como você é o autor da resposta, fica válido. Só uma opinião, claro…

3 curtidas

Muito show. Deu certo. Muito obrigada pela disponibilidade e explicaão.

1 curtida

Sem problemas, sua opinião é bem válida!
As vezes faço por hábito colocar somente o código e esquecer de dar uma breve explicação por sempre pensar que é algo muito simples (na minha visão)!

1 curtida

Pessoal, desculpa mais uma vez aperriar voces, olha só.
Meu tabuleiro (a parte grafica) esta enxergando a matriz de uma forma diferente da matriz do console como mostra a imagem. É a unica coisa que falta para completar o projeto. Considerando que o [i] é a linha e o [j] a coluna, na matriz desenhada, ele le o contrario, ao invez de [ i ][ j ] ele lê [ j ] [ i ]. Nao consigo entender o por que ele enxerga dessa forma.

Você checou se é a forma em que seus laços for funcionam? Pense nisso.

Esse código tá funcional? Em todo for você cria um JLabel novo…