Alternativa para problema com Calculo de ICMS

Boa noite pessoal, eu de novo, como estou estudando bastante acabam surgindo muitas dúvidas. Resolvi reproduzir um sistema de uma planilha em Excel que eu criei para a empresa em que trabalho. E cheguei no seguinte ponto:
O sistema é de uma Trading de grãos do grupo de empresas, basicamente este sistema faz a analise de margem de compra e vendas de grãos (Milho, Soja e Feijão). Para isto um dos passos mais importantes é o calculo de imposto, o qual eu tenho completo domínio. Ao tentar levar isso pro Java, minha ideia foi de criar uma classe ICMS mãe, com 3 filhas IcmsMilho, IcmsSoja, IcmsFeijão. Porém eu preciso decidir no código qual das 3 classes usar na variável icms porque o cálculo de impostos para cada um deles é diferente. Aí que pensei bom, posso tratar isso com um if … Coloco um input para escolher o produto e dependendo de qual produto ele escolher eu instancio a classe correta. O grande problema é que não compila, porque da forma que está o java fica acusando que a variável não está iniciada e a classe ICMS é abstrata. Alguém me ajuda por favor ?

 public class Main {
    	public static void main(String[] args) {
    		String produto = "";
    		Icms icms;
    		ArrayList<String> index = new ArrayList<String>();
    		index.add("1");
    		index.add("2");
    		index.add("3");

    		produto = JOptionPane.showInputDialog("Digite o número do produto:\n1 - Milho\n2 - Soja\n3 - Feijão")
    				.toString();

    		if (produto.equals("1")) {
    			icms = new IcmsMilho();
    		} else if (produto.equals("2")) {
    			icms = new IcmsSoja();
    		} else if (produto.equals("3")) {
    			icms = new IcmsFeijao();
    		}

    		while (!index.contains(icms.getEstadoDaFilial())) {
    			icms.setEstadoDaFilial(JOptionPane
    					.showInputDialog("Digite o número do estado da Filial Cereais Sul:\n1 - GO\n2 - MG\n3 - DF")
    					.toString());
    		}
    		while (!index.contains(icms.getEstadoDeSaida())) {
    			icms.setEstadoDeSaida(
    					JOptionPane.showInputDialog("Digite o estado de entrada:\n 1 - GO\n2 - MG\n3 - DF").toString());
    		}
    		while (!index.contains(icms.getAtividade())) {
    			icms.setAtividade(JOptionPane
    					.showInputDialog(
    							"Digite o número da atividade do produtor:\n1 - Produtor\n2 - Cooperativa\n3 - Cerealista")
    					.toString());
    		}

    	}
    }

Acho que é só inicializar a variável icms com valor null:

String produto = "";
Icms icms = null;
ArrayList<String> index = new ArrayList<String>();

Bom dia amigo,

Uma classe abstrata serve apenas para demonstrar quais métodos devem ser criados (substituídos) para que o objeto fique completo.

Portanto você não irá instanciar.

Olha este exemplo que encontrei

Uma classe abstrata é como se fosse uma classe de referência e nunca deve ser instânciada.

Por exemplo, imagine a Classe Veículo, que deriva as classes Carro e Moto.
A classe Carro é uma especialização da classe Veículo, e a classe Moto é uma especialização da classe Veículo. Logo as classes Carro é Moto podem ser instânciadas, criando objetos da classe Carro e Moto, que de uma certa forma são Veículos. Sendo assim podemos dizer que a classe Veiculo contém métodos que devem ser reescritos na classe Carro e Moto, tornando a Classe Veículo Abstrata, porque nunca deveria ser instânciada, funcionando como uma referência para as classes Carro e Moto.

Bom dia ! Obrigado por Responderem ! @diego12 vou tentar inicia-la como null.

@edumatias Obrigado pela ajuda, exatamente esse meu problema, eu preciso iniciar a variável porém a mãe é abstrata e preciso de um if pra decidir qual das filhas instanciar, e o Java não compila de dentro do if. Na parte final do código onde tem os Whiles e usa o objeto icms.settersougetters ele fica marcando erro por não iniciar a variável.