Erro arquivo TXT

Tenho um arquivo TXT que preciso ler linha por linha.

Leio o arquivo assim:

     public List<ProdutosMOD> getProdutos() {
        List<ProdutosMOD> produtos = new ArrayList<ProdutosMOD>();
        ProdutosMOD produto;
        String caminhoLocal = System.getProperty("user.dir");
        try {
            FileReader arq = new FileReader(caminhoLocal + "\\Arquivos\\Enviar\\produtos.txt");
            BufferedReader lerArq = new BufferedReader(arq);

            String linha = lerArq.readLine();
            while (linha != null) {
                String[] campos = linha.split("\\|");
                produto = new ProdutosMOD();
                produto.setId(Integer.parseInt(campos[0].trim()));
                produto.setNome(campos[1].trim());
                produto.setMarca(campos[2].trim());
                if (!campos[3].trim().equals("")) {
                    produto.getGrupo().setId(Integer.parseInt(campos[3].trim()));
                }
                if (!campos[4].trim().equals("")) {
                    produto.getSubgrupo().setId(Integer.parseInt(campos[4].trim()));
                }
                if (!campos[5].trim().equals("")) {
                    produto.setEstoque(Integer.parseInt(campos[5].trim()));
                }
                produto.setPrecoVenda(new BigDecimal(campos[6].trim()));
                produto.setDesconto(new BigDecimal(campos[7].trim()));

                produtos.add(produto);

                linha = lerArq.readLine();
            }
            arq.close();
            return produtos;
        } catch (IOException e) {
            StatusLog statusLog = new StatusLog();
            statusLog.setErro("Erro na abertura do arquivo produtos.txt");
            FormPrincipal.addLog(statusLog);
        }
        return null;
    }

Cada linha do arquivo tem a seguinte estrutura:
2|ACETONA - IDEAL 500ML|LEMOS E RAGO|1|1|34|11.43|0.00|

Acontece que se uma linha for assim: com o ultimo campo em branco:
2|ACETONA - IDEAL 500ML|LEMOS E RAGO|1|1|34|11.43||

É criado um vetor com uma posição a menos, ai me da erro nessa linha

produto.setDesconto(new BigDecimal(campos[7].trim()));

    Exception in thread "Thread-4" java.lang.ArrayIndexOutOfBoundsException: 7
        at com.softcom.arquivos.LerArquivos.getProdutos(LerArquivos.java:313)
        at com.softcom.forms.FormPrincipal.enviarProdutos(FormPrincipal.java:587)
        at com.softcom.forms.FormPrincipal.access$1300(FormPrincipal.java:49)

Como posso resolver isso? Tem como fazer criar a ultima posição do vetor em branco?

O caractere pipe(|) não precisa das barras invertidas precedendo-o. Dessa forma, o texto passado para o método split é | e as suas linhas não possuem | em nenhum lugar. Assim o split deve retornar um array com apenas uma posição e, quando você tenta acessar a posição 7, ele não tem, e assim lança uma java.lang.ArrayIndexOutOfBoundsException, uma excessão lançada quando se tenta acessar uma posição nao existente em um array. Para confirmar isso que eu disse, coloque essa linha logo abaixo da declaração do array campos:

System.out.println(campos.lenght);

Essa linha vai te mostrar o tamanho do array Campos.
Espero ter ajudado.

Oi @Rodrigo1895,

de acordo com o documentação do método split no javadoc, você pode passar um int para split que determina o número máximo de vezes que a string deve ser dividida. E ainda, que se o número for -1, ele vai aplicar a maior quantidade possível.

Logo, fazer

linha.split("\\|",-1)

deve resolver seu caso. Eu testei aqui e funcionou.
Só detalhe que aí sua String terá 9 casas nesse formato aí, porque também vai considerar o que viria depois do último |.

Você também poderia fazer:

linha.split("\\|",8)

Para sempre forçar o tamanho. Mas nesse caso, por causa do último pipe (|) antes do fim da linha, sua string nunca seria vazia, já que ele entraria na oitava casa do seu array.

Espero ter ajudado. Qualquer dúvida diz aí :smiley:

1 curtida