Java.lang.ArrayIndexOutOfBoundsException

4 respostas
L

Começo por agradecer qualquer ajuda que possam dar.

O erro é simples, aparentemente estou a exceder o limite do array, no entanto, não percebo como.

Coloquei alguns prints dentro dos ciclos para ver como o programa estava a correr.
Não percebo se o tamanho é 5, como é que o programa "rebenta" logo na introdução do terceiro elemento.
Tenho a classe de TestEnterprise, onde o problema se coloca logo no main, dentro do for, onde estou a fazer o prenchimento do array:

package Caelum_JavaOrientacaoObjectos;

public class TestEnterprise {

	static void createBigArray (Employee[]e){
		int size = e.length +5;
		Employee[] newEmployees = new Employee[size];
		for (int i = 0; i < e.length -1; i++) {
			newEmployees [i] = e[i];
		} 
		e = newEmployees;
		Enterprise.arrayPosition = e.length;
	}
	
	

	public static void main(String[]args){
		// creates the Enterprise
		Enterprise bigOne = new Enterprise();
		// adds the array to the Enterprise 
		bigOne.employees = new Employee[5];
		// creates employee and add to the enterprise
		Employee j = new Employee();
		bigOne.addEmployee(j);
		//creates employee without adding
		Employee s = new Employee();
		//adding to the array
		for (int i = 0; i < 4; i++) {
			System.out.println("inside the for "+i);
			Employee f = new Employee();
			f.salary = 1000 + i * 100;
			bigOne.addEmployee(f);
			if
			(bigOne.employees.length == bigOne.arrayPosition) System.out.println("Error! All positions already token.");
			createBigArray(bigOne.employees);
		}

		bigOne.showEmployees();

		if 
		(bigOne.employeeBelongs(s)) System.out.println("Belongs.");
		else
			System.out.println("Employee doesn't belong.");
	}

}

e a classe Enterprise onde se processa o adicionar do Funcionário no array:

package Caelum_JavaOrientacaoObjectos;

public class Enterprise {

	String name;
	int code;
	Employee[] employees;
	static int arrayPosition = 0;
	
	void addEmployee(Employee e) {
		int i = (int) (10*Math.random());
		this.employees[arrayPosition] = e;
		System.out.println("inside add employee "+this.employees[arrayPosition]);
		e.name = "nome"+i;
		arrayPosition++;
		
		}
	
	void showEmployees() {
		for (int i = 0; i < this.employees.length; i++) {
		//System.out.println("Employee on position: " + i+ " has salary: "+employees[i].salary);
		this.employees[i].shows();
		}
		}
	
	boolean employeeBelongs(Employee e){
		for (Employee x : this.employees) {
			if (e == x){
				return true;
			}
		}
		return false;
	}
}
Alguém pode me dar umas luzes do que estarei a fazer mal? Fica o print do erro, com os respectivos System.outs de controlo, que o programa dá antes de parar:
inside add employee Caelum_JavaOrientacaoObjectos.Employee@190d11
inside the for 0
inside add employee Caelum_JavaOrientacaoObjectos.Employee@a90653
inside the for 1
Exception in thread "main" java.lang.ArrayIndexOutOfBoundsException: 10
	at Caelum_JavaOrientacaoObjectos.Enterprise.addEmployee(Enterprise.java:12)
	at Caelum_JavaOrientacaoObjectos.TestEnterprise.main(TestEnterprise.java:32)

4 Respostas

nel

Bom dia.

Primeiro, você não pode utilizar um List ao invés de um vetor? Se sim, substitua para List, será um código mais “limpo”, na minha opinião.
Creio, que o problema esteja que você está “pulando” posição do array, digamos que ele esteja na posição 2 e está tentando adicionar na posição 10, sendo que esta posição não existe.

Toda a vez que você chama o método createBigArray() ele atribui um novo valor a variavél estática de sua classe Enterprise, sendo que o método createBigArray() é invocado em um for. Reveja esta lógica, creio que você esteja atribuindo valores incorretos e resultando nesta execption.

Abraços.

L
nel:
Bom dia.

Primeiro, você não pode utilizar um List ao invés de um vetor? Se sim, substitua para List, será um código mais "limpo", na minha opinião.
Creio, que o problema esteja que você está "pulando" posição do array, digamos que ele esteja na posição 2 e está tentando adicionar na posição 10, sendo que esta posição não existe.

Toda a vez que você chama o método createBigArray() ele atribui um novo valor a variavél estática de sua classe Enterprise, sendo que o método createBigArray() é invocado em um for. Reveja esta lógica, creio que você esteja atribuindo valores incorretos e resultando nesta execption.

Abraços.


Obrigada desde já pela ajuda.

O código resulta de um exercício do Caelum daí o uso do array, vou tentar também resolver com List, mas queria perceber qual o meu erro neste código primeiro.

Eu compreendo que devo estar, como disse, saltando posições do array, é a única explicação, mas a questão mantém-se, como?

Olho para a minha classe de testes, corro o main:
public static void main(String[]args){
		// creates the Enterprise
		Enterprise bigOne = new Enterprise();
		// adds the array to the Enterprise 
		bigOne.employees = new Employee[5];
		// creates employee and add to the enterprise
		Employee j = new Employee();
		bigOne.addEmployee(j);
		//creates employee without adding
		Employee s = new Employee();
		//adding to the array
		for (int i = 0; i < 4; i++) {
			System.out.println("inside the for "+i);
			Employee f = new Employee();
			f.salary = 1000 + i * 100;
			bigOne.addEmployee(f);
			if
			(bigOne.employees.length == bigOne.arrayPosition) System.out.println("Error! All positions already token.");
			createBigArray(bigOne.employees);
		}
crio a empresa nela crio o array de cinco posições crio um empregado e adiciono-o à empresa (sobram 4 "lugares") crio outro (que não é adicionado) dentro do for->crio e adiciono 1+1 (sobram 2 lugares) neste momento, na criação do próximo aparecem as mensagens de erro, que apontam para as linhas de código:
this.employees[arrayPosition] = e;[code]
e
bigOne.addEmployee(f);

Agradeço qualquer luz que me possam dar, já fui resolvendo várias questões ao longo das leituras, mas não consigo entender este erro.
Obrigada desde já.

M

hi,

o problema eh que seu método createBigArray (Employee[]e) está sendo chamado a cada execução do loop for, uma vez que seu comando if não esta usando as chaves {} para circundar a chamada do método juntamente com o System.out.println que vc inseriu.
Sendo assim na primeira iteração do for (i==0) o método createBigArray modifica o vetor Employee[]e da classe Enterprise para um novo vetor com 10 posições e em seguida modifica a variavel estatica arrayPosition para o valor 10 tb;
Na segunda iteração do for (i==1) o método addEmployee tenta executar a inserção this.employees[arrayPosition] = e; na posição 10!! q não existe e ai ocorre o erro java.lang.ArrayIndexOutOfBoundsException: 10 … lembre-se que num vetor os índices começam do zero - portanto o seu vetor naquele momento tem posições que vão de 0 a 9!! arrayPosition não poderia ser 10;
Agora experimente executar o seu código com a correção do if abaixo:

public static void main(String[]args){
			// creates the Enterprise
			Enterprise bigOne = new Enterprise();
			// adds the array to the Enterprise 
			bigOne.employees = new Employee[5];
			// creates employee and add to the enterprise
			Employee j = new Employee();
			bigOne.addEmployee(j);
			//creates employee without adding
			Employee s = new Employee();
			//adding to the array
			for (int i = 0; i < 4; i++) {
				System.out.println("inside the for "+i);
				Employee f = new Employee();
				f.salary = 1000 + i * 100;
				bigOne.addEmployee(f);
				if
				(bigOne.employees.length == bigOne.arrayPosition) {
					System.out.println("Error! All positions already token.");
					createBigArray(bigOne.employees)
				}
			}

			bigOne.showEmployees();

			if 
			(bigOne.employeeBelongs(s)) System.out.println("Belongs.");
			else
				System.out.println("Employee doesn't belong.");
		}

Falow

L

Muito obrigada pela ajuda, já tinha andado a olhar para aquele if e a pensar que devia estar a fazer qualquer coisa mal, mas tentei por { mas estava sempre a dar erro (devia estar a por a mais ou a menos) acabei por tirá-las.

Já consegui perceber grande parte dos erros, eu lembrava-me que começava a contar do zero, só pensava que ele estava a criar o novo array correctamente e não.

Pelo que percebi que o novo array apenas "tinha valor"(?) dentro do método createBigArray(), para resolver isso acabei por modificar na classe teste, no método createBigArray e na chamada deste.
Deixo o código completo (ainda apresenta um erro de null, mas como nem todas as posições do array foram preenchidas e muitos campos estão null, é esperado)

package Caelum_JavaOrientacaoObjectos;

public class TestEnterprise {

	static Employee[] createBigArray (Employee[]e){
		int size = e.length +5;
		Employee[] newEmployees = new Employee[size];
		for (int i = 0; i < e.length; i++) {
			//System.out.println("size of the array passed as arg= "+e.length);
			newEmployees [i] = e[i];
			System.out.println("new array length" +newEmployees.length);
			System.out.println("adding to the new array. Position "+i);
		} 
		Enterprise.arrayPosition = e.length;
		//System.out.println("old length" +e.length);
		//System.out.println("Print value of arrayPosition"+Enterprise.arrayPosition);
		e = newEmployees;
		//System.out.println("new length" +e.length);
		return newEmployees;
	}



	public static void main(String[]args){
		// creates the Enterprise
		Enterprise bigOne = new Enterprise();
		// adds the array to the Enterprise 
		bigOne.employees = new Employee[5];
		// creates employee and add to the enterprise
		Employee j = new Employee();
		bigOne.addEmployee(j);
		//creates employee without adding
		Employee s = new Employee();
		//adding to the array
		for (int i = 0; i < 7; i++) {
			System.out.println("inside the for "+i);
			Employee f = new Employee();
			f.salary = 1000 + i * 100;
			bigOne.addEmployee(f);
			if
			(bigOne.employees.length == bigOne.arrayPosition){ 
				System.out.println("Error! All positions already token.");
				bigOne.employees = createBigArray(bigOne.employees);
				
				System.out.println("new length" +bigOne.employees.length);
			}
			
		}
		bigOne.showEmployees();

			if 
			(bigOne.employeeBelongs(s)) System.out.println("Belongs.");
			else
				System.out.println("Employee doesn't belong.");
		}

	}

Obrigadão pela ajuda, valeu :thumbup:

Criado 21 de agosto de 2010
Ultima resposta 22 de ago. de 2010
Respostas 4
Participantes 3