Exception in thread "main" java.lang.StringIndexOutOfBoundsException: String index out of range: -9

7 respostas
EuclidesFilizola

da esse erro qndo tento usar essa classe

import java.io.IOException;
import java.util.ArrayList;


import SQLAda.SQLAdaJ;
public class Acesso_ao_gp {
	

    public static void main (String[]args) throws Exception {
    	
    
	int conexao,retorno; // retorno de SAConnect
	String comando; // recebe o comando a ser executado no GP
	ArrayList <String> quebra1;
	String s1;  // String que será quebrado
    SQLAdaJ sql = new SQLAdaJ();
    
    
    conexao = sql.SAConnect("[telefone removido]","34839SALEXDATFLA2007","SALEX-D","10.3.10.1");
      
    System.out.println(conexao);
  
    comando = "SELECT A1 A2  FROM 001.062 WHERE SA =33683111" + "1";
    
    retorno = sql.SACommand(conexao, comando);
    
    System.out.println(retorno);
    
    System.out.println(sql.strArea);
    
    String areaTemp = sql.strArea;
    areaTemp = areaTemp.substring(0,areaTemp.length()-1);
    
    String index[] = areaTemp.split(",");
    int indice[] = new int[(index.length/2)];
    int j = 0;
    for (int i = 1; i < index.length; i=i+2) {
		indice[j++] = Integer.parseInt(index[i]);
    				
    	}
    retorno = sql.SAGetNext(conexao);
    
    while(retorno >= 0) {
    	
    areaTemp = sql.strArea;
    
    System.out.println(areaTemp);
    
    quebralinha(areaTemp,indice);
    	
   
    
    retorno = sql.SAGetNext(conexao);
    
    }
      
 
    }

	private static String[] quebralinha(String areaTemp, int[] indice) {
		int aux=0;
		
		String array[] = new String[indice.length];
		
		for (int i = 0; i<indice.length;i++){
								
		   array[i] = areaTemp.substring(aux,indice[i]);
		   
		   aux = aux+ indice[i];
		}
	
												
		return array;
		
	}
}

erro que da :

Exception in thread main java.lang.StringIndexOutOfBoundsException: String index out of range: -95

at java.lang.String.substring(Unknown Source)

at SQLada.Acesso_ao_gp.quebralinha(Acesso_ao_gp.java:71)

at SQLada.Acesso_ao_gp.main(Acesso_ao_gp.java:53)

pq é ??? alguem ae pra da um help ?

7 Respostas

francislon

Este erro ocorre pois seu array de string está ultrapassando os limites do seu tamanho. Por exemplo se você tem um array de Strings novo com nove posições, você não pode atribuir nada a novo[11] ou novo[-10], isso acarretaria o mesmo erro que gerou sua classe.

davidbuzatto

Em algum ponto do seu algoritmo você está tentando acessar um índice que não existe na String.

Leia o erro: Exception in thread “main” java.lang.StringIndexOutOfBoundsException: String index out of range: -95

Até mais!

EuclidesFilizola

agradeço a ajuda de vocês. Porém não consigo achar onde estou ultrapassando , ou acessando o índice errado. esse é o problema ;D. Não estou conseguindo enxergar !

francislon

Fugindo um pouco do assunto, dando uma olhada no nome da sua classe percebo que ele está um pouco fora dos padrões adotados em Java. Não sei até onde isto pode te prejudicar no futuro. Mas dê uma lida sobre Code Conventions. Abraço.

davidbuzatto

Seu problema está no seu método quebralinha, onde vc invoca substring.
Depure o código para verificar o valor dos índices que você está usando.

Quanto a padronização, concordo com o francislon… Dê uma pesquisada sobre…

T

[quote]

#     areaTemp = areaTemp.substring(0,areaTemp.length()-1);  
#       
#     String index[] = areaTemp.split(",");  
#     int indice[] = new int[(index.length/2)];  
#     int j = 0;  
#     for (int i = 1; i < index.length; i=i+2) {  
#         indice[j++] = Integer.parseInt(index[i]);  
#                       
#         } 
...
#            array[i] = areaTemp.substring(aux,indice[i]);  
#

Pergunta - o que vem nessa variável "areaTemp"? É possível mostrar um exemplo do que vem nela?

G

Oi Euclides,

Aparentemente existe um erro de lógica no bloco abaixo (na função quebralinha):

       array[i] = areaTemp.substring(aux,indice[i]);
         
       aux = aux+ indice[i];   

Como no comando 'substring' o primeiro parâmetro é a posição do caracter inicial e o segundo parâmetro é a posição do caracter final + 1 (e não o número de caracteres), existe uma aparente contradição:

a) na primeira linha, fica-se com a impressão que indice[i] é a soma de caracteres de todos os campos até "i" (inclusive);

b)  na segunda linha, fica-se com a impressão de que indice[i] é somente o número de caracteres do campo "i";

Para resolver o seu problema, você pode adotar a solução 1 ou 2 dependendo do que indice[i] significa:

1) se indice[i] é o número de caracteres do campo "i", altere a primeira linha para: "array[i] = areaTemp.substring(aux, aux+indice[i]);", acrescentando o termo "aux+" antes de indice[i];

2)  se indice[i] é o número de caracteres de todos os campos até "i", altere a segunda linha para: "aux = indice[i]", retirando o termo "aux+" antes de indice[i].

Espere que isso lhe ajude.

Atenciosamente,

  YT.
Criado 13 de fevereiro de 2008
Ultima resposta 10 de mar. de 2008
Respostas 7
Participantes 5