NullPointerException com random?

7 respostas
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:

public enum Fala {

Fala1,
Fala2,
Fala3,
Fala4,
Fala5;

private static final RandomEnum<Fala> randomEnum = new RandomEnum<Fala>(Fala.class);

Fala falaAleatoria(){
		   return randomEnum.random(2, 3);
	   }


public class RandomEnum<E extends Enum> {

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

De alguma forma, o método falaAleatoria da NullPointerException??
Alguém consegue ver o erro?

7 Respostas

Cris_Finholdt

manda a classe frase tbm!

el_loko_pepe

Na verdade e digitei errado, era “Fala” mesmo.

el_loko_pepe
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:

public enum Fala {

Fala1,
Fala2,
Fala3,
Fala4,
Fala5;

private static final RandomEnum<Fala> randomEnum = new RandomEnum<Fala>(Fala.class);

Fala falaAleatoria(){
		   return randomEnum.random(2, 3);
	   }


public class RandomEnum<E extends Enum> {

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

De alguma forma, o método falaAleatoria da NullPointerException??
Alguém consegue ver o erro?

lucasportela

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];
lucasportela

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.

E

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.

WellingtonRamos

lucasportela:
aqui você não diz qual o tamanho do array.

private final E[] valores = new E[20];


Teoricamente, valores é inicializado em valores = token.getEnumConstants(); dentro do construtor.
Eu depuraria exatamente esse ponto para verificar o que getEnumConstants está retornando.

Criado 28 de agosto de 2011
Ultima resposta 29 de ago. de 2011
Respostas 7
Participantes 5