Interpreter-Fehler Komischer Bug

thelegend27

Aktives Mitglied
Hi Forum,
Bin gerade dabei meine Gui-Bank mal wieder neu zu machen. Diesmal habe ich einen seltsamen Bug gefunden. Wenn ich zu oft hintereinander (mit gleichen Namen) versuche ein Konto zu erstellen, hängt sich das Programm auf, antwortet nicht und gibt auch keine Exceptions zurück.

Hier die Klassen:
Java:
package finalgui2;

/*
* To change this license header, choose License Headers in Project Properties.
* To change this template file, choose Tools | Templates
* and open the template in the editor.
*/

/**
*
* @author Ahmet
*/
public class Account {

    private final String iban;
    private final String pin;
    private final String user;
    private double balance;

    Account(String ibn, String pn, String usr) {
        iban = ibn;
        pin = pn;
        user = usr;
        balance = 0;

    }

    public String getIban() {
        return iban;
    }

    public String getPin() {
        return pin;
    }

    public String getUser() {
        return user;
    }

    public double getBalance() {
        return balance;
    }

    public void deposit(double value) {
        balance += value;
    }

    public void withdraw(double value) {
        balance -= value;
    }

    public void transfer(Account reciever, double value) {
        this.withdraw(value);
        reciever.deposit(value);
    }

}
Java:
package finalgui2;

import java.util.ArrayList;

/*
* To change this license header, choose License Headers in Project Properties.
* To change this template file, choose Tools | Templates
* and open the template in the editor.
*/
/**
*
* @author Ahmet
*/
public class AccountManager {

    public static AccountManager accMan = new AccountManager();
    private int regIndex;
    private ArrayList<Account> accounts;

    AccountManager() {
        accounts = new ArrayList<>();
        regIndex = -1;

    }

    public void addAccount(String usr) {
        String ibn, pin;
        if (accounts.isEmpty()) {
            do {
                ibn = String.valueOf((int) (Math.random() * 10000 + 1000));

            } while ((Integer.parseInt(ibn) >= 10000));

            do {
                pin = String.valueOf((int) (Math.random() * 10000 + 1000));

            } while (Integer.parseInt(ibn) >= 10000);

        } else {
            do {
                ibn = String.valueOf((int) (Math.random() * 10000 + 1000));

            } while ((ibn.equals(accounts.get(findAccount(ibn)).getIban())) && (Integer.parseInt(ibn) >= 10000));

            do {
                pin = String.valueOf((int) (Math.random() * 10000 + 1000));

            } while (Integer.parseInt(ibn) >= 10000);
        }

        Account acc = new Account(ibn, pin, usr);
        accounts.add(acc);
        regIndex++;
    }

    public int findAccount(String iban) {
        int foundIndex = 0;
        for (Account acc : accounts) {
            if (acc.getIban().equals(iban)) {
                foundIndex = accounts.indexOf(acc);
            }
        }
        return foundIndex;
    }

    public String getIban(int indx) {
        return accounts.get(indx).getIban();
    }

    public String getPin(int indx) {
        return accounts.get(indx).getPin();
    }

    public int getRegIndex() {
        return regIndex;
    }
}
Java:
package finalgui2;

import java.awt.Dimension;
import java.awt.Toolkit;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent;
import java.io.IOException;
import java.util.logging.Level;
import java.util.logging.Logger;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JOptionPane;
import javax.swing.JPanel;
import javax.swing.JTextField;

class Gui extends JFrame implements ActionListener {

    JPanel homePan;
    JButton close;
    JLabel homeHeader;
    JButton login;
    JButton register;

    JPanel registerPan;
    JButton leaveReg;
    JLabel registerHeader;
    JTextField nameIn;
    JButton tryRegister;

    JPanel loginPan;
    JButton leaveLog;
    JLabel loginHeader;
    JLabel ibanPrompt;
    JTextField ibanIn;
    JLabel pinPrompt;
    JTextField pinIn;
    JButton tryLogin;

    JPanel loggedInPan;
    JButton leaveLogged;
    JLabel loggedHeader;
    JButton openCheck;
    JButton openWithdraw;
    JButton openDeposit;
    JButton openTransfer;

    JPanel checkPan;
    JButton leaveCheck;
    JLabel checkHeader;
    JTextField balanceOut;

    JPanel withdrawPan;
    JButton leaveWithdraw;
    JLabel withdrawPrompt;
    JTextField withdrawIn;
    JButton tryWithdraw;

    JPanel depositPan;
    JButton leaveDeposit;
    JLabel depositHeader;
    JTextField depositIn;
    JButton tryDeposit;

    JPanel transferPan;
    JButton leaveTransfer;
    JLabel transferHeader;
    JLabel transIbanPrompt;
    JTextField transIbanIn;
    JLabel transAmountPrompt;
    JTextField transAmount;
    JButton tryTransfer;

    JPanel mainPan;

    Gui() {
        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        setTitle("Die Bank");
        Dimension screenSize = Toolkit.getDefaultToolkit().getScreenSize();
        setSize(screenSize);
        close = new JButton("Beenden");
        close.addActionListener(this);
        close.setActionCommand("close");
        homeHeader = new JLabel("Wilkommen in der Bank");
        login = new JButton("Einloggen");
        login.addActionListener(this);
        login.setActionCommand("login");
        register = new JButton("Registrieren");
        register.addActionListener(this);
        register.setActionCommand("register");
        homePan = new JPanel();
        homePan.add(close);
        homePan.add(homeHeader);
        homePan.add(login);
        homePan.add(register);
        homePan.setVisible(true);

        leaveReg = new JButton("<=");
        leaveReg.addActionListener(this);
        leaveReg.setActionCommand("leaveReg");
        registerHeader = new JLabel("Geben sie Ihren Namen ein, um sich zu registrieren");
        nameIn = new JTextField(15);
        tryRegister = new JButton("registrieren");
        tryRegister.addActionListener(this);
        tryRegister.setActionCommand("tryRegister");
        registerPan = new JPanel();
        registerPan.add(leaveReg);
        registerPan.add(registerHeader);
        registerPan.add(nameIn);
        registerPan.add(tryRegister);
        registerPan.setVisible(false);

        leaveLog = new JButton("<=");
        leaveLog.addActionListener(this);
        leaveLog.setActionCommand("leaveLog");
        loginHeader = new JLabel("Geben Sie ihre Kontonummer und PIN ein um sich anzumelden");
        ibanPrompt = new JLabel("Kontonummer:");
        ibanIn = new JTextField(6);
        pinPrompt = new JLabel("PIN: ");
        pinIn = new JTextField(6);
        tryLogin = new JButton("einloggen");
        tryLogin.addActionListener(this);
        tryLogin.setActionCommand("tryLogin");
        loginPan = new JPanel();
        loginPan.add(leaveLog);
        loginPan.add(loginHeader);
        loginPan.add(ibanPrompt);
        loginPan.add(ibanIn);
        loginPan.add(pinPrompt);
        loginPan.add(pinIn);
        loginPan.add(tryLogin);
        loginPan.setVisible(false);

        leaveLogged = new JButton("<=");
        leaveLogged.addActionListener(this);
        leaveLogged.setActionCommand("leaveLogged");
        loggedHeader = new JLabel("Wilkommen");
        openCheck = new JButton("Kontostand einsehen");
        openCheck.addActionListener(this);
        openCheck.setActionCommand("openCheck");
        openWithdraw = new JButton("Betrag auszahlen");
        openWithdraw.addActionListener(this);
        openWithdraw.setActionCommand("openWithdraw");
        openDeposit = new JButton("Betrag einzaheöen");
        openDeposit.addActionListener(this);
        openDeposit.setActionCommand("openDeposit");
        openTransfer = new JButton("Betrag überweisen");
        openTransfer.addActionListener(this);
        openTransfer.setActionCommand("openTransfer");
        loggedInPan = new JPanel();
        loggedInPan.add(leaveLogged);
        loggedInPan.add(loggedHeader);
        loggedInPan.add(openCheck);
        loggedInPan.add(openWithdraw);
        loggedInPan.add(openDeposit);
        loggedInPan.add(openTransfer);
        loggedInPan.setVisible(false);

        leaveCheck = new JButton("<=");
        leaveCheck.addActionListener(this);
        leaveCheck.setActionCommand("leaveCheck");
        checkHeader = new JLabel("Ihr Kontostand beträgt: ");
        balanceOut = new JTextField(15);
        balanceOut.setEditable(false);
        checkPan = new JPanel();
        checkPan.add(leaveCheck);
        checkPan.add(checkHeader);
        checkPan.add(balanceOut);
        checkPan.setVisible(false);

        leaveWithdraw = new JButton("<=");
        leaveWithdraw.addActionListener(this);
        leaveWithdraw.setActionCommand("leaveWithdraw");
        withdrawPrompt = new JLabel("Geben Sie den Betrag an den Sie abheben möchten!");
        withdrawIn = new JTextField(10);
        tryWithdraw = new JButton("abheben");
        tryWithdraw.addActionListener(this);
        tryWithdraw.setActionCommand("tryWithdraw");
        withdrawPan = new JPanel();
        withdrawPan.add(leaveWithdraw);
        withdrawPan.add(withdrawPrompt);
        withdrawPan.add(withdrawIn);
        withdrawPan.add(tryWithdraw);
        withdrawPan.setVisible(false);

        leaveDeposit = new JButton("<=");
        leaveDeposit.addActionListener(this);
        leaveDeposit.setActionCommand("leaveDeposit");
        depositHeader = new JLabel("Geben Sie den Betrag an, den Sie einzahlen möchten!");
        depositIn = new JTextField(10);
        tryDeposit = new JButton("überweisen");
        tryDeposit.addActionListener(this);
        tryDeposit.setActionCommand("tryDeposit");
        depositPan = new JPanel();
        depositPan.add(leaveDeposit);
        depositPan.add(depositHeader);
        depositPan.add(depositIn);
        depositPan.add(tryDeposit);
        depositPan.setVisible(false);

        leaveTransfer = new JButton("<=");
        leaveTransfer.addActionListener(this);
        leaveTransfer.setActionCommand("leaveTransfer");
        transferHeader = new JLabel("Geben sie den Empfänger und den Betrag der Überweisung an!");
        transIbanPrompt = new JLabel("Kontonummer des Empfängers: ");
        transIbanIn = new JTextField(6);
        transAmountPrompt = new JLabel("Betrag: ");
        transAmount = new JTextField(6);
        tryTransfer = new JButton("überweisen");
        tryTransfer.addActionListener(this);
        tryTransfer.setActionCommand("tryTransfer");
        transferPan = new JPanel();
        transferPan.add(leaveTransfer);
        transferPan.add(transferHeader);
        transferPan.add(transIbanPrompt);
        transferPan.add(transIbanIn);
        transferPan.add(transAmountPrompt);
        transferPan.add(transAmount);
        transferPan.add(tryTransfer);
        transferPan.setVisible(false);

        mainPan = new JPanel();
        mainPan.add(homePan);
        mainPan.add(registerPan);
        mainPan.add(loginPan);
        mainPan.add(loggedInPan);
        mainPan.add(checkPan);
        mainPan.add(withdrawPan);
        mainPan.add(depositPan);
        mainPan.add(transferPan);
        add(mainPan);

    }

    public void actionPerformed(ActionEvent evt) {
          /*
      
                        homeScreen
      
          */
        if (evt.getActionCommand().equals("close")) {
            System.exit(0);
        } else if (evt.getActionCommand().equals("register")) {
            homePan.setVisible(false);
            registerPan.setVisible(true);
            validate();
        } else if (evt.getActionCommand().equals("login")) {
            homePan.setVisible(false);
            loginPan.setVisible(true);
            validate();
            /*
      
                            loggedIn
      
             */
        } else if (evt.getActionCommand().equals("openCheck")) {
            loggedInPan.setVisible(false);
            checkPan.setVisible(true);
            validate();
        } else if (evt.getActionCommand().equals("openWithdraw")) {
            loggedInPan.setVisible(false);
            withdrawPan.setVisible(true);
            validate();
        } else if (evt.getActionCommand().equals("openDeposit")) {
            loggedInPan.setVisible(false);
            depositPan.setVisible(true);
            validate();

        } else if (evt.getActionCommand().equals("openTransfer")) {
            loggedInPan.setVisible(false);
            transferPan.setVisible(true);
            validate();
            /*
      
                            try-Buttons
      
             */
        } else if (evt.getActionCommand().equals("tryRegister")) {
            AccountManager.accMan.addAccount(nameIn.getText());
             JOptionPane.showOptionDialog(null, "Ihre Kontonummer lautet: " + AccountManager.accMan.getIban(AccountManager.accMan.getRegIndex()) + "\n" +
                                                " Ihre PIN lautet: " + AccountManager.accMan.getPin(AccountManager.accMan.getRegIndex()) ,
                                                "Registration erfolgreich", JOptionPane.DEFAULT_OPTION, JOptionPane.INFORMATION_MESSAGE, null, null, null);
        } else if (evt.getActionCommand().equals("tryLogin")) {
          
        } else if (evt.getActionCommand().equals("tryWithdraw")) {
        } else if (evt.getActionCommand().equals("tryDeposit")) {

        } else if (evt.getActionCommand().equals("tryTransfer")) {

            /*
      
                            leave-Buttons
      
             */
        } else if (evt.getActionCommand().equals("leaveReg")) {
            if (evt.getActionCommand().equals("leaveReg")) {
                registerPan.setVisible(false);
            }
            homePan.setVisible(true);
            validate();
        } else if (evt.getActionCommand().equals("leaveLog")) {
            loginPan.setVisible(false);
            homePan.setVisible(true);
        } else if (evt.getActionCommand().equals("leaveLogged")) {
            loggedInPan.setVisible(false);
            homePan.setVisible(true);
            validate();
        } else if (evt.getActionCommand().equals("leaveCheck")) {
            checkPan.setVisible(false);
            loggedInPan.setVisible(true);
            validate();
        } else if (evt.getActionCommand().equals("leaveWithdraw")) {
            withdrawPan.setVisible(false);
            loggedInPan.setVisible(true);
            validate();
        } else if (evt.getActionCommand().equals("leaveDeposit")) {
            depositPan.setVisible(false);
            loggedInPan.setVisible(true);
            validate();
        } else if (evt.getActionCommand().equals("leaveTransfer")) {
            transferPan.setVisible(false);
            loggedInPan.setVisible(true);
            validate();
        }
    }
}
Java:
/*
* To change this license header, choose License Headers in Project Properties.
* To change this template file, choose Tools | Templates
* and open the template in the editor.
*/
package finalgui2;

/**
*
* @author Ahmet
*/
public class FinalGUI2 {

    /**
     * @param args the command line arguments
     */

  
     public static void main(String[] args) {
        // TODO code application logic here
        Gui gui = new Gui();
        gui.setVisible(true);
    }
   
  
}
 

JStein52

Top Contributor
Hast du schonmal deine do while - Schleifen in addAccount gedebugged ? Das ist das einzige was mir beim ersten Anschauen ins Auge fällt was zu einer ziemlich langwierigen Schleife entarten könnte
 

Thallius

Top Contributor
Deine letzte while Schleife endet nur wenn ibn > 10000 ist. Ibn wir innerhalb der Schleife aber nicht geändert. Ergo läuft die Schleife endlos wenn ibn > 10000 ist.

Überhaupt, was soll der qatsch mit den schleifen. Wenn du nur zahlen zwischen 1000 und 9999 haben willst dann passe doch einfach die Berechnung dafür an. Dafür braucht es keine Schleife.

Gruß

Claus
 

Ähnliche Java Themen

Neue Themen


Oben