[RESOLVIDO] ERRO java.lang.ArrayIndexOutOfBoundsException: 3

Boa tarde!
Sou nova tanto em programação quanto no Fórum e estou enfrentando esse seguinte erro, alguém poderia dar-me uma luz?

Códigos:

public class ControleTermo {
String caminho;
boolean validar2;

public ControleTermo() {
    this.caminho="termo.txt";
    this.validar2=false;
}
     

 public boolean VerificarTermo(String codigo, String termo, String significado, String fonte) {
  
    ArrayList<DicTermo> ValidaTermoExiste = LeituraTermo();//

    for (int i = 0; i < ValidaTermoExiste.size(); i++) { 
      
       validar2 = ValidaTermoExiste.get(i).getTermo().equals(termo)
                && ValidaTermoExiste.get(i).getSignificado().equals(significado)
                && ValidaTermoExiste.get(i).getFonte().equals(fonte);
    }
    return validar2;
}
    
public ArrayList<DicTermo> LeituraTermo() {

    ArrayList<DicTermo> listaTermo = new ArrayList();
    DicTermo termo;

    try (BufferedReader bR = new BufferedReader(new FileReader("termo.txt"))) {

      while (bR.ready()) {
		String linha = bR.readLine();
	  
			String campos[] = linha.split(";");
                            termo = new DicTermo();
			
			termo.setCodigo(campos[0]);
			termo.setTermo(campos[1]) ;
			termo.setSignificado(campos[2]);
			termo.setFonte(campos[3]);
			System.out.println(listaTermo);
			listaTermo.add(termo);
        }
      
    } catch (Exception e) {
        e.printStackTrace();
    }

    return listaTermo ;
}
    

 public void escreverLinha(String codigo, String termo, String significado, String fonte) {
    if(termo.length()>=2&&termo.length()<=30
            && significado.length()>=2 && significado.length()<=30
            &&fonte.length()>=10 && fonte.length()<=30){ 

String linha=(codigo + “;” + termo + “;” + significado + “;” + fonte);
//System.out.println(linha);

    try (BufferedWriter bW = new BufferedWriter(new FileWriter("termo.txt", true))) {
        bW.write(linha);
        bW.newLine();
 //       System.out.println(linha);
    } catch (Exception e) {
        JOptionPane.showMessageDialog(null, "Erro ao gravar no arquivo","ERRO",JOptionPane.ERROR_MESSAGE);
    }

 }else{
        JOptionPane.showMessageDialog(null,"Verifique a quantidade de caracteres:\nTERMO: de 2 a 200 caracteres\nFONTE: de 20 a 500 caracteres\nSIGNIFICADO: de 2 a 600 caracteres","ERRO",JOptionPane.ERROR_MESSAGE);

}
}

public void RemoverTermo(String codigo, String termo, String significado, String fonte) {
    String linhaDadosRemover = codigo + ";" + termo+ ";" + significado+ ";" + fonte;
    try (BufferedReader bRremover = new BufferedReader(new FileReader("termo.txt"))) {

        String linha = bRremover.readLine();
        ArrayList<String> removerTermo = new ArrayList();
        while (linha != null) {
            if (linha.equals(linhaDadosRemover) == false) {
                removerTermo.add(linha);
            }
            linha = bRremover.readLine();
        }

        FileWriter fw = new FileWriter(caminho);
        fw.close();
        FileWriter fw2 = new FileWriter(caminho, true);
        BufferedWriter bw = new BufferedWriter(fw2);
        for (int i = 0; i < removerTermo.size(); i++) {
            bw.write(removerTermo.get(i));
            bw.newLine();
        }

        bw.close();
        fw2.close();

    } catch (Exception e) {
        JOptionPane.showMessageDialog(null, "Erro ao remover termo","ERRO",JOptionPane.ERROR_MESSAGE);

    }

}



public void AlterarTermo(String linhaAntiga, String linhaAtual) {

    if (!linhaAntiga.equals(linhaAtual)) {
        try (BufferedReader bRAlterar = new BufferedReader(new FileReader("termo.txt"))) {
      
            String linha = bRAlterar.readLine();
            ArrayList<String> alterarTermo = new ArrayList();
            while (linha != null) {
                alterarTermo.add(linha);
                linha = bRAlterar.readLine();
            }
               
            for (int i = 0; i < alterarTermo.size(); i++) {

                if (alterarTermo.get(i).equals(linhaAntiga)) {
                    alterarTermo.set(i, linhaAtual);
                }
            }
            try (BufferedWriter bW = new BufferedWriter(new FileWriter("termo.txt"))) {

                for (int i = 0; i < alterarTermo.size(); i++) {
                    bW.write(alterarTermo.get(i));
                    bW.newLine();
                }

            } catch (Exception e) {

                JOptionPane.showMessageDialog(null, "Erro ao gravar no arquivo","ERRO",JOptionPane.ERROR_MESSAGE);
            }

        } catch (Exception e) {
            JOptionPane.showMessageDialog(null, "Erro ao Alterar o termo.","ERRO",JOptionPane.ERROR_MESSAGE);

        }
    } else {
        JOptionPane.showMessageDialog(null, "Nenhum dado foi alterado.","ERRO",JOptionPane.ERROR_MESSAGE);
    }
}

public int idTermo() {
    int id;

    ArrayList<DicTermo> idTermo = LeituraTermo();
    id = Integer.parseInt(idTermo.get(idTermo.size() - 1).getCodigo()) + 1;

    return id;
}

} 

A outra classe da Tela

ControleTermo tabelatermo = new ControleTermo();
TelaCadastro telaCad = new TelaCadastro();

private int index;

 private void mostrarTableTermo() {
    DefaultTableModel modelTermo = (DefaultTableModel) tabelaDic.getModel();

    Object rowData[] = new Object[4];
    ArrayList<DicTermo> listaTermo = tabelatermo.LeituraTermo();
    for (int i = 0; i < listaTermo.size(); i++) {
        rowData[0] = listaTermo.get(i).getCodigo();
        rowData[1] = listaTermo.get(i).getTermo();
        rowData[2] = listaTermo.get(i).getSignificado();
        rowData[3] = listaTermo.get(i).getFonte();
        modelTermo.addRow(rowData);
        
        
    }
}

E também para comentar que a jtable é povoada por um arquivo txt
Obrigado desde já!

Bem-vinda ao fórum.

A exceção que você mostrou está apontando para a linha 53 da classe ControleTermo.
Ela é do tipo ArrayIndexOutOfBoundsException: significa que tentou acessar uma posição de um array que não existe (a posição 3).

Essa é a linha 53, né?
Essa posição 3 não existe, confira seu arquivo de texto ou faça uma verificação do tamanho do array campos.

Certo! Obrigado pela resposta, já havia dado uma googleada e encontrei que seria mesmo relacionado algo ao vetor, mas já verifiquei e alterei o tamanho, mesmo assim o erro persiste, ele faz a leitura do arquivo texto, só até a metade… talvez seja algum problema do arquivo?

Coloque para fazer o print da variável linha.
Aí quando der o erro você vai saber exatamente onde está o problema no seu arquivo.

Provavelmente a linha não tem campos suficientes (não tem ; em quantidade suficiente), resultando em um array com menos que 4 posições, aí dá erro na hora de pegar os elementos de campos.

Boa Tarde @Natalia_Tessmann quando vc diz que ele faz a leitura ate a metade do arquivo texto, vc quer dizer que ele consegue ler varias linhas e dai para na metade do arquivo?

Porque se for isso com certeza no seu arquivo texto, existe uma linha que não tem a quantidade de campos suficientes

Exemplo:

posição 0;posição 1;posição 2;posição 3
banana; maça; pera; uva
kiwi; açai; buriti; sirigoela
laranja;manga;cupuaçu
melancia, melao, acerola; limao

No exemplo acima na linha onde se tem
laranja;manga;cupuaçu

esse seu código daria esse mesmo erro pois a posição campos[3] não existe.

Abraços

Olá, muito obrigado pela resposta de todos, especialmente a sua @FacaNaCaveira eu realmente já imaginava qual era o erro, por dar uma pesquisada antes de recorrer ao Fórum, mas não encontro o erro realmente no arquivo txt… e sim, ele lê até o termo 12, e para com a leitura…

esse seria o arquivo

Melhor mostrando até o ultimo item do arquivo

Você fez o print da variável linha?
Meu palpite é uma quebra de linha na linha que deu erro.
Com o print poderia ver melhor o problema.

Falai @RoinujNosde otima ideia, atraves do notepad++ @Natalia_Tessmann vc consegue ver isso, ativando o item destacado em vermelho

depois que aperta vai aparece assim

Aonde aparecer CR FL foi dado um Enter

Abraços

1 curtida

Muito obrigado pessoal! Problema RESOLVIDO! Consegui encontrar a quebra de linha! vlw mesmo!

1 curtida