Java.lang.ArrayIndexOutOfBoundsException

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:

[code]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.");
}

}
[/code]

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

[code]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;
}

}
[/code]

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)

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.

[quote=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.[/quote]
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

	[code]bigOne.addEmployee(f);[/code]

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á.

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

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: