Erro java.lang.ArrayIndexOutOfBoundsException: 480000

7 respostas
D

Estou desenvolvendo uma aplicação gráfica e quando clico para aplicar um filtro dá este erro:

Exception in thread “AWT-EventQueue-0” java.lang.ArrayIndexOutOfBoundsException: 480000
at mamo.Imagem.filtroSobel(Imagem.java:276)

Alguém sabe o significado do erro. Já pesquisei mas não estou conseguindo resolver.

Grato pela atenção.

7 Respostas

renzonuccitelli

Vc está estourando o seu array. Tome cuidado para só usar os recursos que vc tenha reservado…

ivandasilva

Meu querido, debuga a sua classe para ver onde o seu array esta estourando.

G

Você está tentando acessar um índice inexistente de sua array.
Verifique seus laços, e suas validações.

Marky.Vasconcelos

Voce esta tentando acessar o indice 480000 de algum array… eu acho bem dificil alguem precisar de um array desse tamanho.
Isso deve ser um erro de programação. Poste o código.

D

Obrigado pelo auxílio.

Não estou conseguindo achar o ponto onde estoura o array (já que é grande).
Cada posição do array p é um pixel da imagem... então se tenho uma imagem de 800x600 o array p terá 800*600 posições.
O filtro irá percorrer cada posição e alterar baseada numa matriz de valores.

Dei uma olhada nos tipos de dados int mas parece que ele suporta o valor descrito.

Deve ser algum fator que não consigo ver no array.

Bom... segue o código.

public void filtro(){

	int width = img_in.getWidth();//Armazena a largura da imagem Buffered
	int height = img_in.getHeight();//Armazena a altura da imagem Buffered
	int[] p = new int[width*height]; //Cria o array de processamento da imagem
	int dx;
	int dy;
	int offset=0; 

	img_out = new BufferedImage(width,height,BufferedImage.TYPE_BYTE_GRAY);
	WritableRaster raster = img_out.getRaster();

	Raster inputRaster = img_in.getData();
	inputRaster.getPixels(0,0,width,height,p);

	for (int h=1;h<height;h++){
		for (int w=1;w<width;w++){

			dx=0; dy=0;
			offset = h*width+w;
			dx=(p[(h-1)*width+(w-1)]*1 + p[h*width+(w-1)]*2+ p[(h+1)*width+(w-1)]*1)
			    +(p[(h-1)*width+(w+1)]*(-1) + p[h*width+(w+1)]*(-2)+p[(h+1)*width+(w+1)]*(-1));
				
			dy=(p[(h-1)*width+(w-1)]*1 + p[(h-1)*width+w]*2 + p[(h-1)*width+(w+1)]*1)
		                    +(p[(h+1)*width+(w-1)]*(-1) + p[(h+1)*width+w]*(-2)+ p[(h+1)*width+(w+1)]*(-1));
	
			dx+= (p[offset]*9);
			dy+= (p[offset]*0);
			dx+=dy;

			if (dx<0){
			   if ((dx*(-1))<=255)
			      raster.setSample(w,h,0,dx*(-1));
			   else
			      raster.setSample(w,h,0,255);
			} else if(dx>255){
			   raster.setSample(w,h,0,255);
			} else
			   raster.setSample(w,h,0,dx);		

			}
		}
		
	}
victorwss
denerfs:
Obrigado pelo auxílio.

Não estou conseguindo achar o ponto onde estoura o array (já que é grande).
Cada posição do array p é um pixel da imagem... então se tenho uma imagem de 800x600 o array p terá 800*600 posições.
O filtro irá percorrer cada posição e alterar baseada numa matriz de valores.

Dei uma olhada nos tipos de dados int mas parece que ele suporta o valor descrito.

Deve ser algum fator que não consigo ver no array.

Bom... segue o código.

public void filtro(){

	int width = img_in.getWidth();//Armazena a largura da imagem Buffered
	int height = img_in.getHeight();//Armazena a altura da imagem Buffered
	int[] p = new int[width*height]; //Cria o array de processamento da imagem
	int dx;
	int dy;
	int offset=0; 

	img_out = new BufferedImage(width,height,BufferedImage.TYPE_BYTE_GRAY);
	WritableRaster raster = img_out.getRaster();

	Raster inputRaster = img_in.getData();
	inputRaster.getPixels(0,0,width,height,p);

	for (int h=1;h<height;h++){
		for (int w=1;w<width;w++){

			dx=0; dy=0;
			offset = h*width+w;
			dx=(p[(h-1)*width+(w-1)]*1 + p[h*width+(w-1)]*2+ p[(h+1)*width+(w-1)]*1)
			    +(p[(h-1)*width+(w+1)]*(-1) + p[h*width+(w+1)]*(-2)+p[(h+1)*width+(w+1)]*(-1));
				
			dy=(p[(h-1)*width+(w-1)]*1 + p[(h-1)*width+w]*2 + p[(h-1)*width+(w+1)]*1)
		                    +(p[(h+1)*width+(w-1)]*(-1) + p[(h+1)*width+w]*(-2)+ p[(h+1)*width+(w+1)]*(-1));
	
			dx+= (p[offset]*9);
			dy+= (p[offset]*0);
			dx+=dy;

			if (dx<0){
			   if ((dx*(-1))<=255)
			      raster.setSample(w,h,0,dx*(-1));
			   else
			      raster.setSample(w,h,0,255);
			} else if(dx>255){
			   raster.setSample(w,h,0,255);
			} else
			   raster.setSample(w,h,0,dx);		

			}
		}
		
	}

800*600=480000
O seu array tem 480000 posições, numeradas [color=red]de 0 até 479999[/color].

EDIT:
for (int h=1;h<height;h++){
		for (int w=1;w<width;w++){

Porque você começa em 1, e não em 0?

D

É necessário começar na linha 1 e coluna 1 para não gerar ruído na imagem e para aplicar o filtro corretamente.

Criado 25 de março de 2009
Ultima resposta 26 de mar. de 2009
Respostas 7
Participantes 6