Estou desenvolvendo um programinha em Java que captura o conteúdo de um arquivo que em cada linha dele tem 600 posições. O conteúdo do arquivo fica dentro de um array e eu localizo cada parte da linha utilizando um array[0].substring(). Ele funciona normal até um certo número, pois se eu tento localizar o registro array[0].substring(530,589) ele me acusa erro de out of range. Mas a linha que ele tentou ler tem as 600 poisições.
Eu abri o arquivo e na linha que ele dá o erro ele tem conteúdo, e na linha que não tem conteúdo ele passa normal.
Será? Imprima o valor de “length” dessa tal string.
B
bKn
o segundo argumento do método subString é a quantidade de caracteres à partir do primeiro argumento. ou seja, você está tentando pegar do caractere 530 ao 1119.
J
jairelton
Na realidade o segundo parâmetro é o índice final mesmo, está correto.
Mas essa String não deve ter essa quantidade de caracteres não, dê uma olhada nisso aí, tente imprimir o tamanho da String pra você ver, ou inspecionar o valor da variável pra ver o que foi colocado no array, talvez o erro esteja no preenchimento do array e não no substring.
G
gujuser
Boa tarde,
não é não.
provavelmente a linha é menor mesmo, sysout no length mesmo.
flw.
T
thingol
Não é a quantidade coisa nenhuma. Não é C++ nem VB nem C#. O segundo parâmetro é a posição final (exclusive).
I
icjunior07
Boa tarde,
Obrigado pela ajuda ai galera, mas to achando estranho uma coisa.
Fiz o length, e nas linhas que ele me mostrou o resultado, blz, ele acusou o tamanho de 600, mas na que deu o erro ele acusou menor mesmo, por isso do erro de out of bounds, mas se vc abre o arquivo essa mesma linha tem as mesmas 600 posições, onde a única diferença dela é um pouco mais de caracteres ao invés de espaços em branco.
Copiei e colei até em outro lugar essas duas linhas mas estão aparentemente idênticas.
T
thingol
Normalmente isso é algum problema com caracteres não-imprimíveis (por exemplo, zeros binários dentro do arquivo, ou vários Carriage Returns (ASCII 13, Unicode \u000D, Java \r com apenas um Line Feed (ASCII 10, Unicode \u000A, \n).
Será possível você tentar abrir o mesmo arquivo em um editor que mostre a codificação hexadecimal das linhas? Pode ser que você descubra alguma coisa estranha nesse arquivo. O Java costuma filtrar o lixo quando você lê o arquivo como arquivo-texto.
Eu normalmente nunca uso diretamente “substring” porque ele tem esse problema de dar uma exceção se você exceder algum dos limites. Eu prefiro escrever um encapsulamento para “substring” que retorne “” se por acaso houver alguma coisa que exceder algum limite.
G
gujuser
Boa Tarde,
não é possível… a posição existe nas duas linhas!
vc tem ctz que o erro ocorre nessas linhas mesmo?
só para testar, pegue essas duas linhas e rode o programa só pra
elas e veja o que acontece.
flw.
I
icjunior07
Então, eu rodei nessas duas linhas e o erro acusou naquela em que tem o endereço de email.
Aí fiz o seguinte teste:
tirei o email dessa linha e mandei rodar novamente, aí foi normal.
Será que tem algum caracter estranho ali quando tem o email?
oddy.silva
Boa tarde amigo. Vejo que provavelmente você deve estar trabalhando com layout de algum sistema. Se não for, eu trabalho e algumas vezes passo por algo parecido. Quando eu tenho esse erro é porque está acontecendo o seguinte: o método substring() pressupões que você esteja escrevendo em uma única linha. Então, quando passamos o conteúdo para algum arquivo, um txt, por exemplo, há quebra de linhas. O que pode estar ocorrendo é o seu arquivo ter gerado uma quebra de linha em algum lugar. O que eu recomendo: Em vez de gerar um txt, crie uma StringBuffer, jogue num loop for, e cada passagem do loop, vá concatenando os pedaços de String que você precisa. Assim que terminar, você cria uma String qualquer e atribui a ela o valor armazenado na StringBuffer. Daí você vai ter certeza mesmo que não houve quebra de linha. Depois de feito isso, dê um System.out.println() e informe o tamanho da linha de sua String. Depois compare com o arquivo gerado.