Erro nullPointer em inserção de dados à um BD

Nesse código, é criado uma aba em html para a inserção de dados em um bd, contudo ao apertar o botão que realiza o cadastro, exibe que está dando o erro de NullPointer apontando para a linha 21 aonde existe um PreparedStatement que realiza a inserção do “filme”. Não estou conseguindo achar o que estaria causando esse erro, alguém tem alguma ideia do que seja ?

image

O erro:

Método que chama a inserção
private Filme filme = new Filme();
private List listaFilme;

public String salvar() {
	Connection conexao = ConnectionFactory.getConnection();
	FilmeDAO filmedao = new FilmeDAO(conexao);

	try {
		if(filme.getNome().isEmpty()) {
			JSFUtil.addInfoMessage("Campo NOME não informado");
		} else {
			if(String.valueOf(filme.getValor()).isEmpty()) {
				JSFUtil.addInfoMessage("Campo VALOR não informado");
			} else {
				if(filme.getGenero().isEmpty()) {
					JSFUtil.addInfoMessage("Campo GÊNERO não informado");
				}else {
					if(filme.getDisponivel().isEmpty()) {
						JSFUtil.addInfoMessage("Campo DISPONIVEL não informado");
					} else {
						filmedao.inserir(filme);
						listaFilme.add(filme);
					}
				}
			}
		}
		JSFUtil.addInfoMessage("Filme " + filme.getNome() + " salvo com sucesso");
		filme = new Filme();
		conexao.close();
	} catch(SQLException e) {
		JSFUtil.addInfoMessage("ERRO AO CONECTAR COM O BANCO DE DADOS");
	}
	
	return " ";
}

Código de inserção:
private Connection conexao;

public FilmeDAO(Connection conexao) {
	this.conexao = conexao;
}

public void inserir(Filme filme) throws SQLException {
	String sql = "insert into filme (Nome, Valor, Genero, Disponivel) values (?,?,?,?)";
	PreparedStatement comando = conexao.prepareStatement(sql);
	comando.setString(1, filme.getNome());
	comando.setDouble(2, filme.getValor());
	comando.setString(3, filme.getGenero());
	comando.setString(4, filme.getDisponivel());
	
	comando.execute();
}

Aba html:

Cadastro de Filme

Voltar
			<h:outputText value="* Valor:" />
				<h:inputText value="#{filmeController.filme.valor}" maxlength="8" size="15" />
				
			<h:outputText value="* Gênero:" />
				<h:inputText value="#{filmeController.filme.genero}" maxlength="40" size="40" />
				
			<h:outputText value="* Disponivel:" />
				<h:selectOneRadio value ="#{filmeController.filme.disponivel}">
					<f:selectItem  itemValue="S" itemLabel="Sim"   /> 
					<f:selectItem  itemValue="N" itemLabel="Não"   /> 
					
				</h:selectOneRadio>
				
				<h:commandButton action="#{filmeController.salvar}" value="Cadastrar"></h:commandButton>
				<h:commandButton action="#{filmeController.voltar}" value="Voltar"></h:commandButton>
		</h:panelGrid>
	</h:form>

</f:view>

Qual é a linha 21 da classe FilmeDAO?

A linha em questão é essa:
PreparedStatement comando = conexao.prepareStatement(sql);

Também fiz um método para listar em uma tabela o que tem dentro do bd, e aponta o mesmo erro nessa linha.

A tua conexao deve ser null. Mostra a tua classe ConnectionFactory

Segue abaixo o código:
public class ConnectionFactory {

public static Connection getConnection() {
	String driver = "com.mysql.cj.jdbc.Driver";
	String local = "jdbc:mysql://localhost/locadora";
	String login = "root";
	String senha = "root";
	
	Connection conexao = null;
	
	try {
		Class.forName(driver);
		conexao = DriverManager.getConnection(local, login, senha);
		JSFUtil.addInfoMessage("Conexão efetuada");
	}catch(ClassNotFoundException e) {
		JSFUtil.addInfoMessage("DRIVER DO BANCO NÃO ENCONTRADO");
	} catch(SQLException e) {
		JSFUtil.addInfoMessage("ERRO CONECTANDO AO BANCO");
	}
	return conexao;
}

}

Qual destas três infomessage está efetivamente a ser adicionada?

image

Ele aponta que foi efetuado a conexão e no console apenas mostra isso:

Eu tenho esse mesmo código no formato de cliente, do cliente eu consigo inserir, mas não consultar e do filme eu não consigo inserir, mas consigo consultar tudo que está no bd.