NullPointerException com random?

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.