0

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
  • Todos los errores `NullPointerException` son por exactamente lo mismo, has intentado usar un método de un objeto que no es un objeto, si no un `null`, y `null` no tiene métodos. Y de hecho, el error te indica **exactamente** el archivo y la línea en donde está el problema: `BaseDatosBanco.java:53`, es decir, la clase BaseDatosBanco en la línea 53. No tienes más que ir tirando del hilo y verás que estás usando un objeto que está a null. Siempre, siempre es así. Esa es la razón de ser de un *NPE*. – Benito-B Jun 07 '21 at 17:16
  • Creo que vi donde ocurre el error, mi metodo obtenerCuenta (esta dentro de BaseDatosBanco solo que no lo incluí porque pensé que no era el problema) me retorna null si no encuentra la cuentaActual, entonces creo que es ahí donde viene el null. – Emmanuel Guerrero Hernandez Jun 07 '21 at 17:53

0 Answers0