Java.lang.ArrayIndexOutOfBoundsException ?

13 respostas
D

Galera, eu tenho uma array que gerado por um split(";"), a partir da leitura de um arquivo texto.

..
String ret[];
ret = linha.split(";");
..

Depois disso eu vou pegando as posições que preciso nesse array e vou setando set(ret[0]), set(ret[2]), set(ret[4]) etc… só que as linhas do arquivo ora vem com 236 ponto e virgulas( ; ) e ora vem com 220, ora vem com 230 etc… então quando tento pegar o indice de ret[233] ele dá java.lang.ArrayIndexOutOfBoundsException, pois não existe, nas linhas que tem o array com o tamanho acima de 233 ele vai senão dá esse erro…

teria uma forma de eu acertar isso, para que não de esse erro???

um abraço. :?: :cry:

13 Respostas

marcioa1

Coloca o loop no qual você seta o array.

Márcio

D

Ai está o loop!!

...
ArquivoTextoBean atb = new ArquivoTextoBean();

FileReader reader = new FileReader("arquivo.txt");
BufferedReader leitor = new BufferedReader(reader);

while ((linha = leitor.readLine()) != null) {
		 	
String ret[];
ret = linha.split(";");	 

atb.setContrato(atv.ValidaContrato(ret[0],25));
...
...
...
}
...

:thumbup:

foia

usa o .length no array para saber o número de "splits" (tamanho do array).

assim:

String ret[];
  ret = linha.split(";");

 for(int j=0; j<ret.length; ret++)
 {
    set(ret[j]);
  }
>
D

No caso seria…

String ret[];
   ret = linha.split(";");
 
  for(int j=0; j<ret.length; j++)
  {
     set(ret[j]);
   }

senão vai dar erro em ret++!?

Ele chegou a ler o arquivo um bom pedaço mais mesmo assim deu o erro
java.lang.ArrayIndexOutOfBoundsException!!>

foia

10:00 … ainda tô “bootando”. é isso mesmo !! :mrgreen: :mrgreen:
em que linha deu erro ?!

D

Está dando erro logo na sétima linha, pois estu tentando pegar o indice ret[223] e essa linha não tem a quantidade de ( ; ) suficiente para chegar a esse indice pois cada linha vem com tamanho diferente.

Não sei se vc está entendendo o que está acontecendo?? :?:

foia

posta teu código ou o método inteiro.

fica mais fácil.

D

Ai está!!! dá erro onde está em negrito ret[223], mas como as linhas do arquivo podem vir com ( ; ) variando para mais ou menos entã pode dar erro em qualque lugar.

public void arquivo() {
	String linha = null;
	ArquivoTextoValida atv = new ArquivoTextoValida();
	ArquivoTextoBean atb = new ArquivoTextoBean();
	List l = new ArrayList();
	int Array[] = null;

  try {
	FileReader reader = new FileReader("arquivo.txt");
	BufferedReader leitor = new BufferedReader(reader);

	/* grava o codigo-fonte no disco */
	String arquivoFonte = "saida.txt";
	PrintWriter saida = new PrintWriter(new BufferedWriter(new FileWriter(arquivoFonte)));
	
	leitor.readLine();//Leio a primeira linha e descarto
	while ((linha = leitor.readLine()) != null) {//Pega apartir da segunda.
	 	
	 	String ret[];
		ret = linha.split(";");	 
		
		for(int j=0; j < ret.length; j++){
		   
			atb.setContrato(atv.ValidaContrato(ret[0],25));
		
			atb.setContaCorrente(atv.ValidaContaCorrente(ret[2],ret[154]));
						 	   	
			atb.setDesignacaoCVP(atv.ValidaDesignacaoCVP(ret[7],50));
			
			atb.setDesignacaoPontaAB(atv.ValidaDesignacaoPontaAB(ret[8],ret[9],50));
				
			atb.setVelocidadeCIR(atv.ValidaVelocidadeCIR(ret[11], ret[12],20));
			
			atb.setDlciPortaAB(atv.ValidaDLCIPortaAB(ret[13],ret[14],5));
			
			atb.setStatusFacilidadeCircuito(atv.ValidaStatusFacilidadeCircuito(ret[18],25));
			String status = ret[18];
			if(!status.equals("") || status != ""){
				if(status.toUpperCase().equals("ATIVADA") || status.toUpperCase().equals("ATIVADA DADOS") || status.toUpperCase().equals("ATIVADA VOZ")){
					atb.setDataAtividadeCadastroCVP(atv.ValidaDataAtividadeCadastramentoCVP(ret[21]));
				}else if(status.toUpperCase().equals("CONTRATADA")){
					atb.setDataAtividadeCadastroCVP(atv.ValidaDataAtividadeCadastramentoCVP(ret[22]));
				}else{
					atb.setDataAtividadeCadastroCVP("00/00/0000");
				}
			}else{
				atb.setDataAtividadeCadastroCVP("00/00/0000");
			}
			
			atb.setDesignacaoPortaAB(atv.ValidaDesignacaoPortaAB(ret[46],ret[79],50));

			atb.setVelocidadeSCRAB_BA(atv.ValidaVelocidadeSRCAB_BA(ret[166],ret[167],10));

			atb.setVelocidadePCRAB_BA(atv.ValidaVelocidadePCRAB(ret[168],ret[169],10));
			
			atb.setFacilidadePontaAB(atv.ValidaFacilidadeAB(ret[194],[b]ret[223][/b],32));

			atb.setSiglaServico(atv.ValidaSiglaServico(7));
			
			if ( !ret[43].equals(ret[76])){
            			atb.setPlataformaPortaAB(atv.ValidaPlataformaPortaAB(ret[43],50));
            			l.add(atb);					
				atb.setPlataformaPortaAB(atv.ValidaPlataformaPortaAB(ret[76],50));
			}else{
				atb.setPlataformaPortaAB(atv.ValidaPlataformaPortaAB(ret[43],50));
			}
		l.add(atb);//Adiciona na lista o objeto			
	 }
}
	System.out.println("Arquivo gerado com sucesso!!");
	leitor.close();
	reader.close();
  } catch (Exception e) {
	 e.printStackTrace();
	 System.out.println("Erro ao gerar arquivo de saida!! " + e);
  }
}
foia

pois é, vai ter que tirar o for de lá e colocar um if antes de cada setXXX. fica feio, mas funciona. :mrgreen: :mrgreen:

obs: pelo visto esta “carga” não tem um padrão, certo !?

D

Seguinte, porque isso acontece, fiz um teste aqui e o split() não está refletindo a quantidade de ( ; ), porque???

Ex…esse é um pedaço do arquivo, duas linhas 1º linha tem 42 ( ; ) a 2º tem 18 ( ; ), mandei ele escrever a quantidade de ( ; ) que ele está achando e ele imprime só 7 porque??? ele está pegando só até o último ( ; ) após o FRAME-RELAY o resto ele descarta porque???

:?:

noobsaibot

Olá amigos,

Resolvi reaproveitar este tópico, pois, estou encontrando dificuldades para executar o seguinte código:

package org.nsclient4j;

public class CLStat {
   public static void main(String args[]) {
     try {
       NSClient4j client = new NSClient4j("10.1.1.15");
       System.out.print("Result:" + client.getPerfMonCounter("\Processador(_Total)\% tempo de processador"));                           
     } catch (NSClient4JException e) {
       System.err.println("Exception Geting Stat:" + e);
     }
   }
 }

Executo ele através da seguinte linha de comando:

java org.nsclient4j.CLStat

E estou obtendo o seguinte erro:

Exception in thread "main" java.lang.ArrayIndexOutOfBoundsException: 0
        at org.nsclient4j.CLStat.main(CLStat.java:14)

Espero que possam me ajudar.

Grato!

P

To com o mesmo erro dos amigos acima… Alguém tem alguma solução para quando usamos Split em um arquivo que não seja padronizado? Ou seja, podem existir splits a mais ou a menos…

Já tentei testar se split é vazio com if, usar o tokenizer mas nada deu certo. :shock:

Obrigado.

P

PhillTi:
To com o mesmo erro dos amigos acima… Alguém tem alguma solução para quando usamos Split em um arquivo que não seja padronizado? Ou seja, podem existir splits a mais ou a menos…

Já tentei testar se split é vazio com if, usar o tokenizer mas nada deu certo. :shock:

Obrigado.

Fala galera.

Depois de quebrar a cabeça aqui consegui encontrar a solução que seria testar a quantidade de arrays gerados pelo split da linha lida do arquivo e tratar de acordo com esta condição;

ex:

if (linha.split(" ").length < 3)
      {
          teste1 = linha.split(" ")[2];
       }
else
      {
          teste1 = linha.split(" ")[3]
       }

Até mais…

Criado 17 de agosto de 2005
Ultima resposta 7 de ago. de 2009
Respostas 13
Participantes 5