dúvida em substring

Boa tarde a todos,

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.

Alguém já pegou algo parecido?

[]´s

Junior

Será? Imprima o valor de “length” dessa tal string.

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.

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.

Boa tarde,

não é não.

provavelmente a linha é menor mesmo, sysout no length mesmo.

flw.

Não é a quantidade coisa nenhuma. Não é C++ nem VB nem C#. O segundo parâmetro é a posição final (exclusive).

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.

Um exemplo de que funcionou na leitura:

1118779 ABADIA NEVES BERETA DE SOUZA                                                              06882000010012360AVENIDA MAJOR NICACIO                                                                                                                                 2842                                                                                 SAO JOSE                                                    310SP1440346016372423020766832880711959788013SSUSPENSO CLAUS 3  PAR  4    II31/03/06        16653085      SSPSP23/11/65                                                            B00000000000F00000002

Agora um que deu erro:

155467  ABDALA MACHADO DA COSTA                                                                   00523000010092671R 13 DE MAIO                                                                                                                                          1500                                                                                 CENTRO                                                      536SP13630000195613522 5834525687211140746078A                                              5325072       SSP  18/01/52rogertedesco@hotmail.com                                    B00000000000M00000008

Copiei e colei até em outro lugar essas duas linhas mas estão aparentemente idênticas.

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.

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.

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?

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.

while (conteudo != null) {
sb.append(conteudo);
}

String str = sb.toString();
System.out.println(str.lenght());
System.out.println(seuArquivo.lenght());

tira só o “@” e testa ae pra ver…

flw.