Bom dia pessoal, venho aqui outra vez solicitar a ajuda de vocês, vou tentar me expressar para ser o mais direto possível.
Estou desenvolvendo um projeto para faculdade onde o mesmo tem leitura de biometria para identificação do usuário, isso já esta ok, esta funcionando, porém quando o usuário é identificado preciso acionar algumas ações, como a Classe principal onde esta o código para reconhecimento do usuário estava bem extensa, resolvi desmembrar alguns métodos de controle para outra Classe (CalculoEControle), ai me vem a grande dúvida que estou tendo agora e já tive outras vezes, e que gostaria de sanar.
Na Classe TelaPrincipal, após a identificação do usuário preciso acionar alguns métodos da Classe CalculoEControle, então crio a instância e passo como parâmetro o id do usuário que foi autenticado e um valor, que seria para desenvolver alguns cálculos, pois bem, porém na Classe CalculoEControle, um método chama o outro para pode fazer os cálculos desejados, mas da o erro NullPointerException, ou seja, preciso instanciar ela novamente para poder executar os métodos, então se fazer isso terei problema, como tive outras vezes. Bem não sei se fui claro, vou postar um pedaço do código para ver se ajuda!
Essa é um método da classe TelaPrincipal
protected void init() {
capturer.addDataListener(new DPFPDataAdapter() {
@Override
public void dataAcquired(final DPFPDataEvent e) {
SwingUtilities.invokeLater(new Runnable() {
public void run() {
PegaUsuarios pegaUsuario = new PegaUsuarios(); //Cria uma instancia de da classe PegaUsuarios
List <Usuario> lista = pegaUsuario.buscarUsuario(); //Cria List (Lista) de Usuario que vai receber os objetos retornados pelo método buscarUsuario()
DPFPSample amostra = e.getSample(); //Captura a amostra para verificar se existe no banco de dados
for (Usuario usuario : lista) { //Cria variável do tipo Usuario que recebe dados da lista
DPFPTemplate temp = DPFPGlobal.getTemplateFactory().createTemplate(); //Criando variável temporária para receber a informação da digital que esta no banco e verificar
temp.deserialize(usuario.getDigital());
int id = usuario.getID();
Double consumo = usuario.getConsumo();
if (verify(amostra, temp)){ //Verifica se o usuário tem o cadastro no banco de dados
CalculoEContole cec = new CalculoEContole(id, consumo);//
break;
}
}
}
});
}
});
}
Esse é um método da classe CalculoEComando
public class CalculoEContole extends TelaPrincipal{
private static CalculoEContole instancia;
private Connection conexao = null;
private PreparedStatement pst = null;
private ResultSet rs = null;
Toolkit toolkit;
Timer timer;
public CalculoEContole(int idUsuario, Double consumo){
timer = new Timer();
timer.schedule(new CalculoEContole.RemindTask(), 0, 5 * 1000); //0 = Delay | 5*1000 = 5 segundos
conexao = ModuloConexao.conector();
}
class RemindTask extends TimerTask {
public void run() {
if (verificaUsuario()) { //Fazer o método de autenticação aqui!!
System.out.println("Entrooooooou!");
pegaDados(id);
} else {
System.out.println("Tempo terminou!");
//timer.cancel(); // Não é preciso porque
// existe o System.exite(0);
System.exit(0); // Stop processo AWT
// (and everything else)
}
}
}
private boolean verificaUsuario(){
Double consumoPermitido = getConsumo();
Double consumoPraticado = null;
String sql = "SELECT COALESCE (SUM(CORRENTE), 0) AS CONSUMO "
+ "FROM CONSUMO C WHERE C.DATA BETWEEN ? AND ? AND C.USUARIO = ?";
//Padrão de Data/Hora = 2016.10.03 00:00:00
try {
pst = conexao.prepareStatement(sql); //pst recebe endereço da base de dados junto com a SQL
pst.setString(1, getData() + " 00:00:00");
pst.setString(2, getData() + " 23:59:59");
pst.setInt (3, getID());
rs = pst.executeQuery(); //rs recebe o retorno da consulta SQL
if(rs.next()) //Se houver retorno do select entra na condição
{
consumoPraticado = rs.getDouble(1); //Variável consumoPraticado recebe o valor da consulta SQL
System.out.println(consumoPraticado);
}
} catch (Exception e) {
JOptionPane.showMessageDialog(null, e);
}
consumoPraticado = (consumoPraticado * 5) / 3600; //(Consumo praticado * tempo de espera para salvar dados no banco) / 3600 segundos (1h)
if(consumoPraticado < consumoPermitido){
return true;
}
return false;
}
Quando vou rodar o app, da o erro pq para usar o VerificaUsuario(), preciso instanciar a classe.
Pensei em usar o padrão Singleton, porém depois de ler sobre, dizem que não é muito bom!
Espero que tenha sido claro e objetivo, abraço.