Pessoal, estou tentando definir o tamanho de um array com uma variável do tipo int. na verdade é o seguinte:
Tenho uma classe Funcionário e uma classe Empresa.
Na classe Empresa tenho um array de funcionários com o tamanho (tamanho da variável definida pelo usuário). Tenho o getTam que defini o valor da variável tam que será usada como tamanho do array, só que quando eu vou adicionar os funcionários dá o seguinte erro
Exception in thread "main" java.lang.ArrayIndexOutOfBoundsException: 0
at empresa.simples.Empresa.adiciona(Empresa.java:20)
at empresa.simples.TestaFuncionario.main(TestaFuncionario.java:22)
se eu mando imprimir a variável tam ele imprime o valor atribuido pelo usuário mas na hora que eu defino o tamanho do array não funciona.
Alguém tem uma solução para resolver este problema?
Aí vão as classes
[code]package empresa.simples;
class Empresa {
private String nome;
private String cnpj;
int contador = 0;
private int tam;
Funcionario[] funcionario = new Funcionario[tam];
void setTam(int tam) {
this.tam = tam;
}
int getTam() {
return this.tam;
}
public void adiciona(Funcionario f) {
this.funcionario[this.contador] = f;
this.contador++;
}
public void imprimeFuncionarios() {
for (int x = 0; x < funcionario.length; x++) {
System.out.println(funcionario[x].getNome());
System.out.println(funcionario[x].getRg() + "\n");
}
}
}[/code]
[code]package empresa.simples;
public class Funcionario {
private String nome;
private String rg;
vc tem q iniciar tam com um falor defaut pra q ele possa setar o tamanho do array
como ele eh null entao gera esse problema
inicia tam com 0, isso jah resolve
Olá amigo! Não funcionou. Se eu inicializar tam com um valor eu posso cadastrar aquele valor de funcionários. O lance é que eu quero definir qualquer valor em tempo de execução para não ficar preso a uma quantidade específica de registros. Na classe TestaFuncionário utilizo um JOptionPane para pegar o valor que quero definir como tamanho do array. Dá só uma olhada…
variavel int o valor default é 0 e não null; se fosse da classe Integer seria null
Se você quer uma coisa mais dinamica use o ArrayList
Pra ArrayList e se vc quiser alterar o tamanho do arraylist tente o método
ensureCapacity()
[quote]Increases the capacity of this <tt>ArrayList</tt> instance, if necessary, to ensure that it can hold at least the number of elements specified by the minimum capacity argument.
param minCapacity the desired minimum capacity[/quote]
Você não pode fazer assim, por que senão sua lista sempre vai ter o tamanho igual a 1.
Seria + - assim:
[code]public class Teste {
ArrayList lista = new ArrayList ();
public void addFuncionario(Funcionario f) {
lista.add(f);
}
public void listaFuncionarios() {
for(Funcionario f : lista) {
// aqui você imprime os atributos da classe Funcionario que desejar...
}
}
[quote=Bruno Lacerda]tenta por Funcionario[] funcionario = new Funcionario[getTam()];
já tentei e não funciona. Estou tentando fazer co ArrayList
O método adiciona está assim:
public void adiciona(Funcionario f) {
ArrayList lista = new ArrayList();
lista.add(f);
}
Agora stou tentando listra os funcionários inseridos
Como seria?[/quote]
Isso que vc fez ai não vai funcionar… vc está declarando o arraylist dentro do método e toda vez q vc chamar o método vai criar uma nova instancia do array… logo esse arraylist vai ter somente 1 item e depois q o método for finalizado ele deixa de existir…
Tenha o ArrayList como um atributo da sua classe
Uma dica, se vc estiver utilizando jdk 1.5 declare o ArrayList assim
ArrayList<Funcionario> funcionarios = new ArrayList<Funcionario>();
Ai seu método adicionar ficaria assim
public void adicionar(Funcionario f) {
funcionarios.add(f);
}
nesse caso seu ArrayList só vai aceitar Adicionar objetos da classe Funcionario.
Resolvido o problema!!!
Usei o exemplo do Diego.
Obrigado pessoal pela força.
Vou estudar mais a ArrayList para ver como trabalhar com registros específicos inseridos e tudo mais.