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

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)

[code]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(&quot;1800&quot;))	{
					fileWriter.write(campo1 + &quot;;&quot; + campo2 + &quot;;&quot; + campo3 + &quot;;&quot; + campo4 + &quot;;\r\n&quot;);// + campo2 + &quot;;&quot; + campo3 + &quot;;&quot;);
					fileWriter2.write(line + &quot;\r\n&quot;);
					cont++;
				}
			}
		}
		System.out.println(cont + &quot; registros \&quot;1800\&quot; encontrados.&quot;);

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

}[/code]

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

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!

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

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