NullPointerException que não estou entendendo. Por favor, Ajuda!

Bom dia caros colegas.

Sou iniciante e venho utilizando o livro do Professor Sérgio Furgeri para estudar. Bem, chegando ao JDBC me surgiu a dúvida a seguir.

Tenho a classe FabricaDeConexao a seguir:

package DAO;

//import javax.sql.*;
import javax.swing.JOptionPane;

import java.sql.*;


public class FabricaDeConexao {
	
	public boolean abreConexao() throws SQLException{
			try{
				//Tenta Encontrar o Driver
				Class.forName(DRIVER);
				
				conexao = DriverManager.getConnection(URL,USUARIO,SENHA);
			
				//Retorna Verdadeiro se tudo for ok
				return true;
			}
		
			//Caso o Driver não seja encontrado
			catch(ClassNotFoundException erro){
				JOptionPane.showMessageDialog(null, "Driver não encontrado " + erro.toString());
				return false;
			}
	}
	
	public void fechaConexao(){
		try {
			conexao.close();
		}
		catch(SQLException erro){
			System.out.println("Erro ao fechar conexao");
		}
	}
	
	
	
	Connection conexao = null;
	
	final String DRIVER = "com.mysql.jdbc.Driver";
	final String BANCO = "banco";
	final String URL = "jdbc:mysql://localhost:3306/"+BANCO;
	final String USUARIO = "aluno";
	final String SENHA = "estacio";
}

E resolvi criar uma classe separada para realizar consultas a um banco, no caso a classe ConsultaFilme a seguir:

package DAO;

import java.sql.*;

public class ConsultaFilme {
	
	private FabricaDeConexao fcConexao = new FabricaDeConexao();
	PreparedStatement statement = null;

	//A linha a seguir define uma String de nome sql que seleciona codigo e o titulo da tabela filmes onde
	//o código seja maior que um valor a ser recebido e menor que outro valor a ser recebido
	//Após isso, os dados são ordenados pelo código
	String sql = "SELECT codigo, titulo FROM Filmes WHERE codigo" + "> ? AND codigo < ? ORDER BY codigo";

	//Cria um objeto da interface PreparedStatement que possibilita a execução de um script SQL
	//PreparedStatement statement = null;
	
	//Método consultaPorCodigo recebe duas Strings, uma com o codigo menor, e outro com o maior
	public void consultaPorCodigo(String codMenor, String codMaior){
		
		try{
			PreparedStatement statement = fcConexao.conexao.prepareStatement(sql);
		}
		catch(SQLException erro){
			System.out.println(erro.toString());
		}
		
		try{
			
			//O objeto statement usa o método setString que recebe como parametro um valor de ordenação e o valor da String
			statement.setString(1, codMenor);
			statement.setString(2, codMaior);
			
			ResultSet resultado = statement.executeQuery();
			
			System.out.println("NOME       TITULO---------------------------------------------------------");
			System.out.println("------     ---------------------------------------------------------------");
			
			while(resultado.next()){
				String codigo = resultado.getString("codigo");
				String titulo = resultado.getString("titulo");
				System.out.println(codigo + "      " + titulo);
			}
			
			resultado.close();
			statement.close();
		}
		catch(SQLException erro){
			System.out.println(erro.toString());
		}
	}
}

Bom, finalizando, eu criei uma classe que vai operar em terminal mesmo para ler duas Strings e chamar o método consultaPorCodigo da classe acima e é aí que aparece o problema, tudo compila, mas quando eu digito os valores e o método é chamado, dá o erro: Exception in thread “main” java.lang.NullPointerException e aponta para as linhas: PreparedStatement statement = fcConexao.conexao.prepareStatement(sql); da classe ConsultaFilme e cf.consultaPorCodigo(valorMenor, valorMaior); da classe abaixo:

package DAO;

import java.util.*;

public class ConsultaFilmesTerminal {
	
	FabricaDeConexao fc = new FabricaDeConexao();

	static String valorMenor;
	static String valorMaior;
	private static Scanner leitor;
	
	public static void main(String[] args) {
		// TODO Auto-generated method stub
		
		leitor = new Scanner(System.in);
		System.out.println("Digite o valor Menor: ");
		valorMenor = leitor.nextLine();

		System.out.println("Digite o valor Menor: ");
		valorMaior = leitor.nextLine();
		
		ConsultaFilme cf = new ConsultaFilme();
		cf.consultaPorCodigo(valorMenor, valorMaior);
	}
}

Sei que a postagem ficou grande, mas tentei ser o mais claro possível, espero que os colegas possam me ajudar a entender isso. Obrigado e fiquem na paz!

Não executei seu código para testar, mas olhando, parece que a variavel conexao (Connection) em FabricaDeConexao não foi instanciada

Tente instanciar a connection assim:

Connection connection = new ConnectionFactory().getConnection();

Dá uma olhada nesta apostila da caelum.

Pessoa, consegui resolver, bastou chamar o método abreConexao(); dentro do construtor da classe.