Problema no programa

Boa noite a todos,
Eu estou fazendo um programa aonde os dados(base) ficam separados da aplicação, mas eu tenho elementos dentro da base que dependem de elementos dentro dela mesma. Acho q essa parte pode estar gerando um erro na hora de alterar os valores que quero, pois quando coloco a aplicação para rodar(apenas para entrar com dados e imprimir) esses elementos retornam apenas 0.0 (No caso, os elementos que apresentam erros são o ataque_Especial e a experiência). Alguém sabe qual pode ser o erro?

public class Base {
protected String nome;
protected double vida, ataque_Especial;
protected double experiencia[] = new double[20];
protected int ataque, defesa, velocidade, agilidade,nivel;

public void setNome(String nome){
	this.nome=nome;
}
public void setVida(double vida) {
	this.vida=vida;
}
public void setAtaque(int ataque) {
	this.ataque=ataque;
}
public void setDefesa(int defesa) {
	this.defesa=defesa;
}
public void setVelocidade(int velocidade) {
	this.velocidade=velocidade;
}
public void setAtaqueEspecial(double ataqueEspecial) {
	ataqueEspecial = (this.ataque+(this.ataque*Math.random()));
	this.ataque_Especial = ataqueEspecial;
}
public void setAgilidade(int agilidade) {
	this.agilidade=agilidade;
}
public void setNivel(int nivel) {
	this.nivel=nivel;
}
public void setExperiencia(double experiencia[]) {
	experiencia[0]=0;
	experiencia[1]=80;
	for(int i=2;i<5;i++) {
		experiencia[i] = experiencia[i-1]*(2.3);
	}
	for(int i=5;i<20;i++) {
		experiencia[i] = experiencia[i-1]*(1.3);
	}
	for(int j=0;j<20;j++) {
		this.experiencia[j]=experiencia[j];
	}
}
public String getNome(){
	return nome;
}
public double getVida() {
	return vida;
}
public int getAtaque() {
	return ataque;
}
public int getDefesa() {
	return defesa;
}
public int getVelocidade() {
	return velocidade;
}
public double getAtaqueEspecial() {
	return ataque_Especial;
}
public int getAgilidade() {
	return agilidade;
}
public int getNivel() {
	return nivel;
}
public double getExperiencia() {
	return experiencia[getNivel()];
}
public Base() {
}
public Base(String nome, double vida, int nivel, int ataque,int defesa, int velocidade, int ataque_Especial, int agilidade) {
	this.nome=nome;
	this.vida=vida;
	this.nivel=nivel;
	this.ataque=ataque;
	this.defesa=defesa;
	this.velocidade=velocidade;
	this.agilidade=agilidade;
}
public void imprimir() {
	System.out.println("Nome: " + getNome());
	System.out.println("Vida: " + getVida());
	System.out.println("Nível: " + getNivel());
	System.out.println("Experiencia: " + getExperiencia());
	System.out.println("Ataque: " + getAtaque());
	System.out.println("Defesa: " + getDefesa());
	System.out.println("Velocidade: " + getVelocidade());
	System.out.println("Ataque Especial: " + getAtaqueEspecial());
	System.out.println("Agilidade: " + getAgilidade());
}
public void entradaDados() {
	Scanner scanner = new Scanner(System.in);
	System.out.println("Entre com o nome: ");
	this.setNome(scanner.nextLine());
	System.out.println("Entre com a vida: ");
	this.setVida(scanner.nextDouble());
	System.out.println("Entre com o nível: ");
	this.setNivel(scanner.nextInt());
	System.out.println("Entre com o ataque: ");
	this.setAtaque(scanner.nextInt());
	System.out.println("Entre com a defesa: ");
	this.setDefesa(scanner.nextInt());
	System.out.println("Entre com a velocidade: ");
	this.setVelocidade(scanner.nextInt());
	System.out.println("Entre com a agilidade: ");
	this.setAgilidade(scanner.nextInt());
}

}

Penso que o problema seja você nao usar os metodos setAtaqueEspecial(double ataqueEspecial) e setExperiencia(double experiencia[])