Duvida sobre erro em java

Boa noite pessoal, sou novo no fórum estou fazendo um curso em java e me deparei com um erro, eu não consigo identificar o erro fazendo o try catch… acho que falta experiência para saber o que o erro está querendo me dizer. Alguém pode me ajudar?
java.lang.NullPointerException
at entities.Individual.taxa(Individual.java:29)
at application.Program.main(Program.java:47)

vou deixa o código das duas classes aqui…

package entities;

public class Individual extends Imposto {

private Double GastosMedicos;

public Individual(){
	super();
}

public Individual(String name, Double impostoAnual, Double gastosMedicos) {
	super(name, impostoAnual);
	GastosMedicos = gastosMedicos;
}

public Double getGastosMedicos() {
	return GastosMedicos;
}

public void setGastosMedicos(Double gastosMedicos) {
	GastosMedicos = gastosMedicos;
}


	@Override
	public double taxa() {
		try{
			double impostoBasico;
			if (getImpostoAnual() < 20000.0){
				impostoBasico = getImpostoAnual() * 0.15;
			}
			else{
				impostoBasico = getImpostoAnual() * 0.25;
			}
			impostoBasico -= getGastosMedicos() * 0.5;
			if(impostoBasico <0.0) {
				impostoBasico = 0.0;
			}
			return impostoBasico;
			
		}
		catch(NullPointerException e){
			System.out.println("Error");
			e.printStackTrace();
			
		}
		return GastosMedicos;
		
}
	
}

==================================================================

package application;

import java.util.ArrayList;
import java.util.List;
import java.util.Locale;
import java.util.Scanner;

import entities.Individual;
import entities.Juridico;
import entities.Imposto;
public class Program {

public static void main(String[] args) {
	
	Locale.setDefault(Locale.US);
	Scanner sc = new Scanner(System.in);
	
	List<Imposto> list = new ArrayList<>();
	
	
	System.out.println("Enter the number of taxpayers");
	int n = sc.nextInt();
	
	
	for(int i=1; i<=n; i++){
		System.out.println("Taxpayer" + i + "Data: " );
		System.out.print("Individual or company (i/c)");
		char ch = sc.next().charAt(0);
		System.out.print("Name: ");
		String name = sc.next();
		System.out.print("Imposto anual:");
		double impostoAnual= sc.nextDouble();
		if(ch == 'i') {
			System.out.println("Gastos com saúde: ");
			double gastosMedicos = sc.nextDouble();
			list.add(new Individual(name, impostoAnual, gastosMedicos));
			} 
			else{
			System.out.print("Numero de funcionarios: ");
			Integer numeroFuncionarios = sc.nextInt();
			list.add(new Juridico(name, impostoAnual, numeroFuncionarios));
		}
		
		System.out.println("");
		System.out.println("TAXES PAID:");
			for(Imposto tp : list) {
			System.out.println(tp.getName() + ": $" + String.format("%.2f", tp.taxa()));
		}
		
		
		double sum = 0.0;
		for(Imposto tp : list) {
			sum += tp.taxa();
			
		}
		
		System.out.println("TOTAL TAXES: $ " + String.format("%.2f", sum));
		sc.close();
	}
	
}

}

Provavelmente sua variável GastosMedicos não foi inicializada.
Pergunta: por que ela é do tipo Double?
Não poderia ser do tipo double?