Separar string por caracter?

Separar linha por Caracter

String linha = arquivoVerificar.readLine();
String[] linhaSeparada = linha.split(Pattern.quote("|"));

Linha:

000001|0000|03323840|BANCO ALFA S.A.|U|3550308|201102|201112|3|1||||3.0|

Ele separa assim:
0-000001
1-0000
2-03323840
3-BANCO ALFA S.A.
4-U
5-3550308
6-201102
7-201112
8-3
9-1
10-
11-
12-
13-3.0

Quanto chega neste código String tipoArred = linhaCompleta[14];, da exceção

Por mais que não informação no índice 14, eu tenho que fazer verificação neste campo.
O que pode estar de errado? A exceção diz que não tem coluna 14.

Exceção:

Caused by: java.lang.ArrayIndexOutOfBoundsException: 14
	at org.desif.controller.desif.erro.estrutural.registro0000.ImportacaoValidacaoCampoRegistro0000Estrutural.inicializar(ImportacaoValidacaoCampoRegistro0000Estrutural.java:53) [classes:]
	at org.desif.controller.desif.arquivo.ImportacaoArquivosEstrutural.iniciar(ImportacaoArquivosEstrutural.java:90) [classes:]
	at org.desif.controller.desif.arquivo.ImportacaoArquivos.iniciandoProcessametoEstrutural(ImportacaoArquivos.java:260) [classes:]
	at org.desif.controller.desif.arquivo.ImportacaoArquivos.run(ImportacaoArquivos.java:369) [classes:]
	at org.desif.controller.desif.arquivo.ArquivoController.processarArquivo(ArquivoController.java:212) [classes:]
	at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) [rt.jar:1.8.0_101]
	at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source) [rt.jar:1.8.0_101]
	at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source) [rt.jar:1.8.0_101]
	at java.lang.reflect.Method.invoke(Unknown Source) [rt.jar:1.8.0_101]
	at javax.el.ELUtil.invokeMethod(ELUtil.java:326) [javax.el-3.0.0.jar:3.0.0]
	at javax.el.BeanELResolver.invoke(BeanELResolver.java:536) [javax.el-3.0.0.jar:3.0.0]
	at javax.el.CompositeELResolver.invoke(CompositeELResolver.java:256) [javax.el-3.0.0.jar:3.0.0]
	at com.sun.el.parser.AstValue.invoke(AstValue.java:269) [javax.el-3.0.0.jar:3.0.0]
	at com.sun.el.MethodExpressionImpl.invoke(MethodExpressionImpl.java:304) [javax.el-3.0.0.jar:3.0.0]
	at org.jboss.weld.util.el.ForwardingMethodExpression.invoke(ForwardingMethodExpression.java:40) [weld-core-impl-2.1.2.Final.jar:2014-01-09 09:23]
	at org.jboss.weld.el.WeldMethodExpression.invoke(WeldMethodExpression.java:50) [weld-core-impl-2.1.2.Final.jar:2014-01-09 09:23]
	at org.jboss.weld.util.el.ForwardingMethodExpression.invoke(ForwardingMethodExpression.java:40) [weld-core-impl-2.1.2.Final.jar:2014-01-09 09:23]
	at org.jboss.weld.el.WeldMethodExpression.invoke(WeldMethodExpression.java:50) [weld-core-impl-2.1.2.Final.jar:2014-01-09 09:23]
	at com.sun.faces.facelets.el.TagMethodExpression.invoke(TagMethodExpression.java:105) [jsf-impl-2.2.5-jbossorg-3.jar:]
	at javax.faces.component.MethodBindingMethodExpressionAdapter.invoke(MethodBindingMethodExpressionAdapter.java:87) [jboss-jsf-api_2.2_spec-2.2.5.jar:2.2.5]
	... 52 more

Não pode condicionar a verificação do campo 14 com o tamanho do array linhaCompleta?

Não entendi ?

Mas porque quando não tem registro na coluna 14, ele não entra ?

Essa exceção é típico de estouro da pilha do objeto Array.
Que tipo é o seu Array linhaCompleta e quais os valores está atribuindo no mesmo? Se puder manda a linha de código onde está atribuindo os valores desse Array.

O erro aconteceu pq nao existe o indice 14. Se quiser pegar a ultima posicao faça linhaCompleta[linhaSeparada.length -1]

Como o gui falou, ele não entra pq não existe a posição 14 no array, ou seja, o 15o elemento do array. Se contar o número de strings geradas pelo split vai observar que contém somente 14 elementos. Lembre-se que o primeiro elemento de um array é alocado no índice 0. Logo, seu array só tem elementos até o índice 13. Como a verificação ocorre no índice 14, o sistema lança ArrayIndexOutOfBoundsException.
Se a lógica de validação no indice 14 é imprescindível, verifique se o índice 14 existe antes de manipula-lo:

String tipoArred = "";
if(linhaCompleta.length>=15)
  tipoArred = linhaCompleta[14]

@raphaeloneves eu fiz isto, mas não tem uma outra maneira ?

Pois se analisar existe a coluna 14, mas ela está vazia.

Assim não passa:= e da exceção:

000001|0000|03323840|BANCO ALFA S.A.|U|3550308|201102|201112|3|1||||3.0|

Assim passa

000001|0000|03323840|BANCO ALFA S.A.|U|3550308|201102|201112|3|1||||3.0|1

A questão é que o arquivo pode vir assim:

000001|0000|03323840|BANCO ALFA S.A.|U|3550308|201102|201112|3|1|||||

Se separar por “|”, ele tem 14 colunas, mesmo com a última não tendo valor.

Sim @igor_ks , mas existe, a não ser que estou fazendo errado.

000001|0000|03323840|BANCO ALFA S.A.|U|3550308|201102|201112|3|1||||3.0|

Sim @gui.oliveira92, eu sei.

Vou colocar meu código

arquivoVerificar = new BufferedReader(new FileReader(arquivo.getLocal()));
String linha = arquivoVerificar.readLine();
String[] linhaSeparada = linha.split(Pattern.quote("|"));

A linha é esta

000001|0000|03323840|BANCO ALFA S.A.|U|3550308|201102|201112|3|1||||3.0|

Ele deveria ter 14 colunas e não 13.

Algo errado não está certo

public static void main(String[] args) {
    String val = "000001|0000|03323840|BANCO ALFA S.A.|U|3550308|201102|201112|3|1||||3.0|";
    String[] vals = val.split(Pattern.quote("|"));
    System.out.println("Total de campos: " + vals.length);
    int count = 1;
    for(String v : vals) {
        System.out.println("Valor: " + (count++) + " - " + v);
    }
}

E a saída foi:

Total de campos: 14
Valor: 000001
Valor: 0000
Valor: 03323840
Valor: BANCO ALFA S.A.
Valor: U
Valor: 3550308
Valor: 201102
Valor: 201112
Valor: 3
Valor: 1
Valor: 
Valor: 
Valor: 
Valor: 3.0

Sim @Luis_Augusto_Santos, eu sei, o total são 15 e não 14, pois depois do 3.0|, mesmo vazio é uma coluna.

Se rodar assim:

000001|0000|03323840|BANCO ALFA S.A.|U|3550308|201102|201112|3|1||||3.0|1

verá que tem 15 e não 14.

Para que fosse, precisaria ter um outro | depois dela

000001|0000|03323840|BANCO ALFA S.A.|U|3550308|201102|201112|3|1||||3.0|1|
Ou
000001|0000|03323840|BANCO ALFA S.A.|U|3550308|201102|201112|3|1||||3.0||

Daria o mesmo resultado e estaria correto

Entendi @Luis_Augusto_Santos.

Não funcionou @Luis_Augusto_Santos, da a mesma exceção

Fiz assim: String linha = arquivoVerificar.readLine() + “|”

Ai fica assim: 000001|0000|03323840|BANCO ALFA S.A.|U|3550308|201102|201112|3|1||||3.0||

Essa String spplitada: 000001|0000|03323840|BANCO ALFA S.A.|U|3550308|201102|201112|3|1||||3.0||
possui 14 posicoes, ou seja, vai do index 0 ao index 13.

Nao existe index 14.

@igor_ks, discordo, pois mesmo nulo, existe.

Mas como pegar este campo mesmo sendo nulo ?

Atribua o resultado do split a uma variável, então, verifique qual o tamanho da mesma. Se for menor do que você espera, trate como exceção, senão, siga o fluxo normal.

Como assim discorda!?! Basta testar. Quem diz isso é o Java.

1 curtida

Igor, você olhando e separando por “|”, identificamos que tem 14 e não 13. Agora se o JAVA não entende que é 13 é outros 500.

Assim são 14 colunas e deveria ser 15, mesmo que no final não tenha valor.
000001|0000|03323840|BANCO ALFA S.A.|U|3550308|201102|201112|3|1||||3.0||

Assim são 15 colunas
000001|0000|03323840|BANCO ALFA S.A.|U|3550308|201102|201112|3|1||||3.0||1