Boa tarde!!
Estava desenvolvendo uma IA e senti a necessidade escolher randomicamente um elemento de um enum, ao passo que fiz uma classe randomEnum como descrita abaixo:
[code]public enum Fala {
Fala1,
Fala2,
Fala3,
Fala4,
Fala5;
private static final RandomEnum randomEnum = new RandomEnum(Fala.class);
Fala falaAleatoria(){
return randomEnum.random(2, 3);
}
public class RandomEnum {
private static final Random random = new Random();
private final E[] valores;
public RandomEnum(Class<E> token) {
valores = token.getEnumConstants();
}
public E random(int min, int max) {
return valores[random.nextInt(max - min + 1) + min];
}
}[/code]
De alguma forma, o método falaAleatoria da NullPointerException??
Alguém consegue ver o erro?
manda a classe frase tbm!
Na verdade e digitei errado, era “Fala” mesmo.
[quote=el_loko_pepe]Boa tarde!!
Estava desenvolvendo uma IA e senti a necessidade escolher randomicamente um elemento de um enum, ao passo que fiz uma classe randomEnum como descrita abaixo:
[code]public enum Fala {
Fala1,
Fala2,
Fala3,
Fala4,
Fala5;
private static final RandomEnum randomEnum = new RandomEnum(Fala.class);
Fala falaAleatoria(){
return randomEnum.random(2, 3);
}
public class RandomEnum {
private static final Random random = new Random();
private final E[] valores;
public RandomEnum(Class<E> token) {
valores = token.getEnumConstants();
}
public E random(int min, int max) {
return valores[random.nextInt(max - min + 1) + min];
}
}[/code]
De alguma forma, o método falaAleatoria da NullPointerException??
Alguém consegue ver o erro?[/quote]
Creio que seja a linha 20
private final E[] valores;
aqui você não diz qual o tamanho do array.
private final E[] valores = new E[20];
Justamente, posso ter me expressado mal, mas o que eu quis dizer é que o array não está instanciado e por isso gera o NullPointer, ou seja, ele deve está passando um token vazio.
Imagino que haja alguma sutileza no seu classloading, porque se você simplesmente escrever um programa bobo de teste, tal como o seguinte:
class TesteFala {
public static void main(String[] args) {
System.out.println (Fala.Fala1.falaAleatoria());
}
}
funciona direitinho. Eu só recomendaria que o método “falaAleatoria” fosse estático para evitar ter de fazer essa “gambis” que mostrei acima (por exemplo, selecionar um elemento arbitrário da enum “Fala”, somente para invocar o método falaAleatoria.
Essa sua classe está dentro de um sistema em um EJB Container ou em um Web Application? É que nesse tipo de sistema as configurações são mais complicadas.
[quote=lucasportela]aqui você não diz qual o tamanho do array.
private final E[] valores = new E[20];
[/quote]
Teoricamente, valores é inicializado em valores = token.getEnumConstants();
dentro do construtor.
Eu depuraria exatamente esse ponto para verificar o que getEnumConstants está retornando.