[Resolvido] - Comportamento estranho do substring(x, y)

3 respostas
Eric_SantAnna

Eu tenho um arquivo com varias linhas contendo 402 caracteres, todos "válidos".
Eu precisava percorrer o arquivo pegando alguns caracteres em posições específicas para criar um novo arquivo csv com essas informações..
Já fiz isso em várias situações...porém dessa vez não funcionou javascript:emoticon(':?');

Já resolvi o problema com o código que comentei a abaixo, mas eu fiquei intrigado, ele basicamente subtrai o segundo parâmetro do primeiro e deixa ele negativo...não entendi nada:

[color=red]Exception in thread "main" java.lang.StringIndexOutOfBoundsException: String index out of range: -296
at java.lang.String.substring(Unknown Source)
at app.ExtratorDeRegistros4GB.main(ExtratorDeRegistros4GB.java:40)
[/color]

Segue o código:
(A parte comentada é a solução que encontrei...bem gambiarra por sinal)

public class ExtratorDeRegistros4GB {

	/**
	 * @param args
	 */
	public static void main(String[] args) {
		FileReader fileReader = null;
		FileWriter fileWriter = null;
		FileWriter fileWriter2 = null;
		BufferedReader leitor = null;
//		String nomeDoArquivo = "D:\\Documentos\\ocs20110925.txt";
		String nomeDoArquivo = "F:\\parte1.txt";
		String arquivoFinal = "F:\\regs2.csv";
		String arquivoConferir = "F:\\Conferir2.txt";
		String line = "";
		
		try {
			
			fileReader = new FileReader(new File(nomeDoArquivo));
			fileWriter = new FileWriter(new File(arquivoFinal));
			fileWriter2 = new FileWriter(new File(arquivoConferir));
			leitor = new BufferedReader(fileReader);
			int cont = 0;
			String campo1 = "";
			String campo2 = "";
			String campo3 = "";
			String campo4 = "";
			line = "";
//			char[] charArray;
			while ((line = leitor.readLine()) != null) {
				if(line.length() >= 402)	{
					campo1 = line.substring(300, 4);
					campo2 = line.substring(37, 21);
					campo3 = line.substring(59, 21);
					campo4 = line.substring(118, 13);
					
//					charArray = line.toCharArray();
//					
//					campo1 = "";
//					for(int i = 398; i <= 401; i++)	{
//						campo1 += charArray[i];
//					}
//					campo2 = "";
//					for(int i = 37; i <= 58; i++)	{
//						campo2 += charArray[i];
//					}
//					campo3 = "";
//					for(int i = 59; i <= 80; i++)	{
//						campo3 += charArray[i];
//					}
//					campo4 = "";
//					for(int i = 118; i <= 131; i++)	{
//						campo4 += charArray[i];
//					}
//					
					System.out.println("=======================");
					System.out.println("Campo1: " + campo1);
					System.out.println("Campo2: " + campo2);
					System.out.println("Campo3: " + campo3);
					System.out.println("Campo4: " + campo4);
					
					if(campo1.equals("1800"))	{
						fileWriter.write(campo1 + ";" + campo2 + ";" + campo3 + ";" + campo4 + ";\r\n");// + campo2 + ";" + campo3 + ";");
						fileWriter2.write(line + "\r\n");
						cont++;
					}
				}
			}
			System.out.println(cont + " registros \"1800\" encontrados.");

		} catch (IOException e) {
			e.printStackTrace();
		} finally	{
			try	{
				fileWriter.close();
				fileWriter2.close();
				fileReader.close();
			} catch (IOException e) {
				e.printStackTrace();
			}
		}
	}

}

Por que o substring(x, y) lançou essa exceção?
Me parece tudo certo...

3 Respostas

Guilherme_Gomes

Está dando erro porque você está usando o substring de maneira errada!

O segundo argumento não é o número de caracteres, mas sim a posição final na String. Pra entender melhor dá uma olhada aqui!

CharlesAlves

Tais colocando os parâmetros para extrair a substring de forma errado o primeiro é o inicio de forma inclusiva e o segundo o ultimo de forma exclusiva ou seja se fizer

String teste = "testando sub String";
   System.out.println(teste.substring(0, 8);

o resultado será “testando”

no caso você está colocando os parâmetros invertidos por isso está dando este erro veja.

campo1 = line.substring(300, 4);  
   campo2 = line.substring(37, 21);  
   campo3 = line.substring(59, 21);  
   campo4 = line.substring(118, 13);
Eric_SantAnna

Nossa, verdade, bizonhei…rs :oops:
Cheguei a olhar no javadoc, mas só vi a descrição do método e assumi que estava certo…
Tinha tanta certeza porque no SQL fazemos assim todo dia…(mas sendo que não tem nada a ver…rs)

Muito obrigado a todos.

Charles, gostei do provérbio na assinatura…a empresa inteira agora sabe dele…lol

Criado 6 de outubro de 2011
Ultima resposta 6 de out. de 2011
Respostas 3
Participantes 3