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|
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
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