String.Split não pega a ultima posição do array

Bom dia prezados, estou precisando de uma ajuda novamente…
Estou percorrendo um arquivo e fazendo algumas modificações em determinadas linhas, abaixo segue um exemplo de linha do arquivo:
|C170|24|135||2,00000|UN|77,56|0,00|0|000|5102|10001|79,33|18,00|14,28|0,00|0,00|0,00||||0,00|0,00|0,00|01|79,33|1,6500|||1,31|01|79,33|7,6000|||6,03||

Pois bem, estou utilizando o metodo Split para salvar as posições da linha em um array mas quando consulto a ultima posição que seria a 37 ele me retorna um java.lang.ArrayIndexOutOfBoundsException, muito estranho pois se eu consultar a posição 36 ou anteriores funciona normalmente. Segue a baixo um pedaço do código.

public void modificaContas() {

	try {

		Arquivo novoArquivo = new Arquivo("C:\\Users\\justi\\Desktop\\EFD Canal\\EfdJS.txt");
		novoArquivo.CriaArquivo();

		InputStream is = new FileInputStream(this.arquivo);
		InputStreamReader isr = new InputStreamReader(is);
		BufferedReader br = new BufferedReader(isr);
		String efd = br.readLine(); // Primeira linha do arquivo do EFD;

		while (efd != null) {
			String[] linha = efd.split("[|]");
			if ( linha[1].equals("C170")) {
				if(linha[11].equals("1102")|| linha[11].equals("2102")|| linha[11].equals("1403")|| linha[11].equals("2403")){
					System.out.println(linha[37]);
				}
				
			} 
			efd = br.readLine();
		}

		br.close();

	} catch (IOException e) {
		// TODO Auto-generated catch block
		e.printStackTrace();
	}
}

}

Isso acontece pois quando os separadores estão em sequencia, como por exemplo || ou ||| o split considera como sendo somente um | ignorando os valores vazios entre eles.
Terás que escrever um método próprio para quebrar sua linha.

Amigo, primeiramente muito obrigado,

Mas tenho uma observação, ele está ignorando somente a ultima posição, nos demais casos está funcionando corretamente.

está sendo ignorando apenas esses dois últimos ||, até a posição |6,03| ele trás normalmente.

Dessa forma não terás que se preocupar com valores vazios entre os |

import java.io.IOException;
import java.util.ArrayList;
import java.util.List;

class Exemplo {

    public static void main(String args[]) {
        try {
            new Exemplo().executar();
        } catch (Throwable t) {
            t.printStackTrace();
        }
    }

    void executar() throws IOException {
        String linha = "|C170|24|135||2,00000|UN|77,56|0,00|0|000|5102|10001|79,33|18,00|14,28|0,00|0,00|0,00||||0,00|0,00|0,00|01|79,33|1,6500|||1,31|01|79,33|7,6000|||6,03||";
        String separador = "|";
        String[] colunas = separar(linha, separador);
        for (int i = 0; i < colunas.length; i++) {
            System.out.printf("%d: %s%n", i, colunas[i]);
        }
    }

    // método para quebrar determinada linha usando o separador informado
    String[] separar(String linha, String separador) {
        List<String> valores = new ArrayList<>();
        int comeco = 0;
        int fim = linha.indexOf(separador, comeco);
        while (comeco > -1 && comeco <= fim && fim > -1) {
            String valor = linha.substring(comeco, fim);
            valores.add(valor);
            comeco = fim + 1;
            fim = linha.indexOf(separador, comeco);
            if (fim == -1) {
                fim = linha.length();
            }
        }
        return valores.toArray(new String[valores.size()]);
    }
}
1 curtida