No estoy muy seguro como formular mi titulo con respecto al problema que tengo. Creo que será mas fácil que explique lo que quiero hacer y lo que hice. Si alguien con mas experiencia me puede ayudar a cambiar el titulo de manera apropiado con lo que estoy preguntando será de gran ayuda.
El error que me genera es:
Exception in thread "AWT-EventQueue-0" java.lang.NullPointerException at atm_002.BaseDatosBanco.obtenerSaldoTotal(BaseDatosBanco.java:53) at atm_002.SolicitudSaldo.ejecutar(SolicitudSaldo.java:25) at atm_002.ATM.realizarTransacciones(ATM.java:90)
No es todo el mensaje, pero esto es lo principal.
Lo que estoy haciendo es un atm, mediante una GUI. Solo mencionare las clases que estoy ocupando para lo que quiero hacer. Lo que quiero hacer es obtener el Saldo y asignarlo a mi jLabel mensaje desde mi clase SaldoSolicitud. Tengo una clase ATM donde tengo un método que se llama realizarTransaccion, este va a recibir un entero de mi jFrame INTERFAZ_TRANSACCIONES. En este caso va a recibir 1 para poder consultar mi saldo. Para las transacciones que se puede realizar tengo un switch que va inicializa como nuevo objeto del tipo elegido (en nuestro caso SolicitudSaldo). Para tal fin llama mi método crearTransaccion. Este método determina qué tipo de transacción va a crear. Entonces se crea la transacción SolicitudSaldo.
En mi clase SolicitudSaldo tengo un método void llamado ejecutar. Mi clase SolicitudSaldo se va a extender a mi clase Transaccion. SolicitudSaldo va a heredar numeroCuentaUsuario, INTERFAZ_TRANSACCIONES pantallaATM, Y BaseDatosBanco baseDatosBanco. Mi método ejecutar va asignar a mi jLabel mensaje el saldoTotal, que lo obtuvo del método obtenerSaldoTotal de baseDatosBanco. Mi jLabel mensaje es público.
Codigo de mi interfaz
public class INTERFAZ_TRANSACCIONES extends javax.swing.JFrame {
BaseDatosBanco datos = new BaseDatosBanco();
SolicitudSaldo saldo = null;
Retiro retirar = null;
Deposito deposito = null;
ATM atm;
public int cuenta, NIP, monto;
public INTERFAZ_TRANSACCIONES() {
initComponents();
setLocationRelativeTo(null);
setResizable(false);
txt_Campo.requestFocus();
jLabel1.setText(" ");
jLabel2.setText(" ");
jLabel3.setText(" ");
jLabel4.setText(" ");
jLabel5.setText(" ");
jLabel6.setText(" ");
mensaje.setText(" ");
txt_Campo.setVisible(true);
jButton_ranura.setVisible(true);
}
private void jButton1ActionPerformed(java.awt.event.ActionEvent evt) {
// TODO add your handling code here:
if(jLabel1.getText().equals("<< Consultar")){
limpiar();
atm = new ATM(this);
atm.realizarTransacciones(1);
jLabel1.setText("<< Regresar");
} else if(jLabel1.getText().equals("<< Regresar")){
limpiar();
Menu();
txt_Campo.setText(" ");
txt_Campo.setVisible(false);
}
}
Codigo de mi Clase ATM
public class ATM
{
public boolean usuarioAutenticado; // indica si el usuario es autenticado
private int numeroCuentaActual; // current user's account number
private Pantalla pantalla; // pantalla del ATM
private Teclado teclado; // teclado del ATM
private DispensadorEfectivo dispensadorEfectivo; // dispensador de efectivo del ATM
private RanuraDeposito ranuraDeposito; // ranura de depósito del ATM
private BaseDatosBanco baseDatosBanco; // base de datos de información de las cuentas
private INTERFAZ_TRANSACCIONES transacciones;
// constantes correspondientes a las opciones del menú principal
private static final int SOLICITUD_SALDO = 1;
private static final int RETIRO = 2;
private static final int DEPOSITO = 3;
// el constructor sin argumentos de ATM inicializa las variables de instancia
public ATM(INTERFAZ_TRANSACCIONES cajero)
{
usuarioAutenticado = false; // al principio, el usuario no está autenticado
numeroCuentaActual = 0; // al principio, no hay número de cuenta
dispensadorEfectivo = new DispensadorEfectivo(); // crea el dispensador de efectivo
ranuraDeposito = new RanuraDeposito(); // crea la ranura de depósito
baseDatosBanco = new BaseDatosBanco(); // crea la base de datos de información de cuentas
transacciones = cajero;
} // fin del constructor sin argumentos de ATM
// trata de autenticar al usuario en la base de datos
public boolean autenticarUsuario(int numCuenta, int nipCuenta)
{
int numeroCuenta = numCuenta; // recibe como entrada el n�mero de cuenta
int nip = nipCuenta; // recibe como entrada el NIP
boolean
// establece usuarioAutenticado con el valor booleano devuelto por la base de datos
usuarioAutenticado =
baseDatosBanco.autenticarUsuario( numeroCuenta, nip );
// verifica si la autenticaci�n tuvo �xito
if ( usuarioAutenticado )
{
numeroCuentaActual = numeroCuenta; // guarda el # de cuenta del usuario
return usuarioAutenticado;
} // fin de if
else
return false;
} // fin del m�todo autenticarUsuario
// muestra el menú principal y realiza transacciones
public void realizarTransacciones(int seleccion)
{
// variable local para almacenar la transacción que se procesa actualmente
Transaccion transaccionActual = null;
boolean usuarioSalio = false; // el usuario no ha elegido salir
// itera mientras que el usuario no haya elegido la opción para salir del sistema
while ( !usuarioSalio )
{
// muestra el menú principal y obtiene la selección del usuario
int seleccionMenuPrincipal = seleccion;
// decide cómo proceder, con base en la opción del menú seleccionada por el usuario
switch ( seleccionMenuPrincipal )
{
// el usuario eligió realizar uno de tres tipos de transacciones
case SOLICITUD_SALDO:
case RETIRO:
case DEPOSITO:
// inicializa como nuevo objeto del tipo elegido
transaccionActual =
crearTransaccion( seleccionMenuPrincipal );
transaccionActual.ejecutar(); // ejecuta la transacción
break;
}
}
} // fin del método realizarTransacciones
// devuelve un objeto de la subclase especificada de Transaccion
public Transaccion crearTransaccion( int tipo )
{
Transaccion temp = null; // variable temporal Transaccion
// determina qué tipo de Transaccion crear
switch ( tipo )
{
case SOLICITUD_SALDO: // crea una nueva transacción SolicitudSaldo
temp = new SolicitudSaldo(
numeroCuentaActual, transacciones, baseDatosBanco );
break;
case RETIRO: // crea una nueva transacción Retiro
temp = new Retiro( numeroCuentaActual, pantalla,
baseDatosBanco, teclado, dispensadorEfectivo );
break;
case DEPOSITO: // crea una nueva transacción Deposito
temp = new Deposito( numeroCuentaActual, pantalla,
baseDatosBanco, teclado, ranuraDeposito );
break;
} // fin de switch
return temp; // devuelve el obejto recién creado
} // fin del método crearTransaccion
Codigo de mi clase SolicitudSaldo
public class SolicitudSaldo extends Transaccion
{
// constructor de SolicitudSaldo
public SolicitudSaldo( int numeroCuentaUsuario, INTERFAZ_TRANSACCIONES pantallaATM,
BaseDatosBanco baseDatosBanco )
{
super( numeroCuentaUsuario,pantallaATM, baseDatosBanco );
} // fin del constructor de SolicitudSaldo
// realiza la transacci�n
public void ejecutar()
{
// obtiene referencias a la base de datos del banco y la pantalla
BaseDatosBanco baseDatosBanco = obtenerBaseDatosBanco();
INTERFAZ_TRANSACCIONES pantalla = obtenerPantalla();
// obtiene el saldo total para la cuenta implicada
double saldoTotal =
baseDatosBanco.obtenerSaldoTotal( obtenerNumeroCuenta() );
// muestra la informaci�n del saldo en la pantalla
pantalla.mensaje.setText("Saldo total: $"+saldoTotal );
}// fin del m�todo ejecutar
} // fin de la clase SolicitudSaldo
Codigo de mi clase Transaccion
public abstract class Transaccion
{
private int numeroCuenta; // indica la cuenta implicada
private INTERFAZ_TRANSACCIONES transacciones; // pantalla del ATM
private Pantalla pantalla; // pantalla del ATM
private BaseDatosBanco baseDatosBanco; // base de datos de informaci�n de cuentas
// el constructor de Transaccion es invocado por las subclases mediante super()
public Transaccion( int numeroCuentaUsuario,INTERFAZ_TRANSACCIONES pantallaATM,
BaseDatosBanco baseDatosBancoATM )
{
transacciones = pantallaATM;
numeroCuenta = numeroCuentaUsuario;
baseDatosBanco = baseDatosBancoATM;
} // fin del constructor de Transaccion
// devuelve el n�mero de cuenta
public int obtenerNumeroCuenta()
{
return numeroCuenta;
} // fin del m�todo obtenerNumeroCuenta
// devuelve una referencia a la pantalla
public INTERFAZ_TRANSACCIONES obtenerPantalla()
{
return transacciones;
} // fin del m�todo obtenerPantalla
// devuelve una referencia a la base de datos del banco
public BaseDatosBanco obtenerBaseDatosBanco()
{
return baseDatosBanco;
} // fin del m�todo obtenerBaseDatosBanco
// realiza la transacci�n (cada subclase sobrescribe este m�todo)
abstract public void ejecutar();
} // fin de la clase Transaccion
Clase de mi BaseDatosBanco
public class BaseDatosBanco
{
public static Cuenta cuentas[]; // arreglo de objetos Cuenta
// el constructor sin argumentos de BaseDatosBanco inicializa a cuentas
public BaseDatosBanco()
{
cuentas = new Cuenta[ 2 ]; // sólo 2 cuentas para probar
cuentas[ 0 ] = new Cuenta(12345, 54321, 1200.0);
cuentas[ 1 ] = new Cuenta(98765, 56789, 200.0 );
} // fin del constructor sin argumentos de BaseDatosBanco
// devuelve el saldo total de la Cuenta con el número de cuenta especificado
public double obtenerSaldoTotal( int numeroCuentaUsuario ){
return obtenerCuenta( numeroCuentaUsuario ).obtenerSaldoTotal();
} // fin del método obtenerSaldoTotal