Java - ATM 银行登录,尝试 3 次密码锁

标签 java authentication console passwords banking

我是java编程新手。我正在尝试创建一个银行系统登录,在输入错误的密码 3 次后锁定用户。我正在尝试合并两段代码。知道为什么“PIN 码错误。再试一次”在控制台中出现两次吗?

ATM类

import java.util.Scanner;

public class ATM {
    public static void useATM(BankAccount bankAccount) {
        Scanner scanner = new Scanner(System.in);
        char option = '\0';
        do {
            Menu.showMenu();
            option = scanner.next().charAt(0);
            switch (option) {
                case 'A':
                    System.out.println(bankAccount.getBalance());
                    break;
                case 'B':
                    System.out.println("Enter an amount to deposit: ");
                    int amountToDeposit = scanner.nextInt();
                    bankAccount.deposit(amountToDeposit);
                    break;
                case 'C':
                    System.out.println("Enter an amount to withdraw: ");
                    int amountToWithdraw = scanner.nextInt();
                    bankAccount.withdraw(amountToWithdraw);
                    break;
                case 'X':
                    System.out.println("The transaction is over. ");
                    break;
                default:
                    System.out.println("Not a valid option. Choose another option.");
                    break;
            }
        } while (option != 'X');
    }
}

BankAccount 类

public class BankAccount {
    String IBAN;
    int balance;
    String pin;

    public BankAccount(String IBAN, int balance, String pin) {
        this.IBAN = IBAN;
        this.balance = balance;
        this.pin = pin;
    }

    public int getBalance() {
        return this.balance;
    }

    public void deposit(int amount) {
        this.balance = this.balance + amount;
    }

    public void withdraw(int amount) {
        if (amount <= this.balance) {
            this.balance = this.balance - amount;
            System.out.println("You withdrew " + amount);
        } else {
            System.out.println("Not enough money. ");
        }
    }
}

BankingSystemWithPin 主类

import java.util.Scanner;

public class BankingSystemWithPin {
    public static void main(String[] args) {
        BankAccount bankAccount1 = new BankAccount("RO29455302311322", 200, "1234");
        BankAccount bankAccount2 = new BankAccount("RO43593530521134", 600, "7530");
        BankAccount[] bankAccounts = {bankAccount1, bankAccount2};
        Scanner scanner = new Scanner(System.in);
        Menu.welcome();
        String pin = scanner.nextLine();
        BankAccount currentBankAccount = BankingSystemWithPin.getBankAccountByPin(bankAccounts, pin);
        ATM.useATM(currentBankAccount);
    }
        public static BankAccount getBankAccountByPin(BankAccount[] bankAccounts, String pin) {
        for (BankAccount bankAccount : bankAccounts) {
            if (bankAccount.pin.equals(pin)) {
                return bankAccount;
            } else if (!bankAccount.pin.equals(pin) ) {
                System.out.println("Wrong Pin. Try Again.");
            }
        }
        return null;
    }
}

菜单类

public class Menu {
    public static void showMenu() {
        System.out.println("Enter an option: ");
        System.out.println("A. Check balance ");
        System.out.println("B. Deposit ");
        System.out.println("C. Withdraw ");
        System.out.println("X. Exit");
    }
        public static void welcome() {
        System.out.println("Welcome! ");
        System.out.println("Please insert your pin: ");
    }
}

对于下一段代码,我正在尝试将其与我的登录系统合并。将其合并到主代码中的正确方法是什么?我应该尝试将其粘贴到 BanckAccount 类中,还是创建一个方法在 main 中调用它?

import java.util.Scanner;

public class PinLockout {
   
            Scanner scanner = new Scanner(System.in);
            int pin = 1234;
            int tries = 0;
            System.out.println("ENTER YOUR PIN: ");
            int entry = scanner.nextInt();
            tries++;
            while (entry != pin && tries < 3) {
                System.out.println("\nINCORRECT PIN. TRY AGAIN.");
                System.out.println("ENTER YOUR PIN: ");
                entry = scanner.nextInt();
                tries++;
            }
            if (entry == pin)
                System.out.println("\nPIN ACCEPTED. ACCESS GRANTED.");
            else if (tries >= 3)
                System.out.println("\nYOU HAVE RUN OUT OF TRIES. ACCOUNT LOCKED.");
        }
    }

}

最佳答案

知道为什么“PIN 码错误。再试一次”在控制台中出现两次吗?

是的...在您的 BankingSystemWithPin.getBankAccountByPin() 方法中,您使用 for 循环来迭代不同的银行帐户以查找相关的 PIN 码。这对于您目前的特定用例来说很好,但是您确实需要删除 else if{} 代码块,原因如下:

例如,如果您有 10 个特定帐户,并且每个帐户都包含一个唯一的 PIN 码,并且输入的 PIN 码与第五个帐户相关,则在每次迭代时直至第 5 个帐户,else if 条件满足,因此输出 Wrong Pin。再试一次。。第五次迭代保存正确的 PIN,然后使用 returnbankAccount; 退出该方法。您将在控制台窗口中看到的是:

Wrong Pin. Try Again.
Wrong Pin. Try Again.
Wrong Pin. Try Again.
Wrong Pin. Try Again.
Enter an option: 
A. Check balance 
B. Deposit 
C. Withdraw 
X. Exit

您不希望 for 循环中出现 else if 代码块,因此只需删除它即可。相反,请将以下代码行直接放置在 for 循环 block 的之后:

System.out.println("Wrong Pin. Try Again.");

请记住,因为您无论如何都会在 for 循环中退出该方法,所以如果可以找到与银行帐户相关的正确 PIN 码,则上面的行将永远到达。仅当无法找到所提供的 PIN 码时才能到达该地址。您的 getBankAccountByPin() 方法应如下所示:

public static BankAccount getBankAccountByPin(BankAccount[] bankAccounts, String pin) {
    for (BankAccount bankAccount : bankAccounts) {
        if (bankAccount.pin.equals(pin)) {
            System.out.println();
            System.out.println("Account Number: " + bankAccount.IBAN);
            return bankAccount;
        } 
    }
    System.err.println("Wrong PIN. Try Again.");
    System.err.println();
    return null;
}

这还不是全部......在调用上述方法之后继续之前,您需要确保它实际上提供了银行帐号。毕竟,如果提供的 PIN 码错误,则不会有银行帐号,而是会返回 null,并且您不想继续使用 null。在显示菜单之前,您需要验证是否确实获取了银行帐号。为此,您需要在 while 循环中调用 getBankAccountByPin() 方法,如下所示:

import java.util.Scanner;

public class BankingSystemWithPin {
    
    private static int pinAttempts = 0;
    
    public static void main(String[] args) {
        BankAccount bankAccount1 = new BankAccount("RO29455302311322", 200, "1234");
        BankAccount bankAccount2 = new BankAccount("RO43593530521134", 600, "7530");
        BankAccount[] bankAccounts = {bankAccount1, bankAccount2};
        Scanner scanner = new Scanner(System.in);
        BankAccount currentBankAccount = null;
        while (currentBankAccount == null) {
            pinAttempts++;
            if (pinAttempts > 3) {
                System.err.println();
                System.err.println("You have exceeded the allowable number of login attempts!");
                System.err.println("The transaction is over. ");
                System.exit(0);
            }
            Menu.welcome();
            String pin = scanner.nextLine();
            currentBankAccount = BankingSystemWithPin.getBankAccountByPin(bankAccounts, pin);
        }
        
        // PIN correct and account number acquired!
        ATM.useATM(currentBankAccount);
    }
    
    public static BankAccount getBankAccountByPin(BankAccount[] bankAccounts, String pin) {
        for (BankAccount bankAccount : bankAccounts) {
            if (bankAccount.pin.equals(pin)) {
                System.out.println();
                System.out.println("Account Number: " + bankAccount.IBAN);
                return bankAccount;
            } 
        }
        System.err.println("Wrong Pin. Try Again.");
        System.err.println();
        return null;
    }
}

现在,用于锁定用户。您如何知道要锁定哪个用户?无法锁定用户,原因很简单,因为不涉及 ATM 卡,您永远不知道要锁定谁。但是,您可以关闭应用程序并强制用户重新启动它,以便在三次失败的尝试后重试。

当您尝试验证 PIN 并获取与其相关的银行帐号时,这显然是最好的方法...BankingSystemWithPin 类。上面的代码还通过添加一个名为 pinAttempts 的私有(private)整数类成员变量并将对 getBankAccountByPin() 方法的调用包装在 while 中来演示这一点。环形。这使事情变得紧凑和简单。

关于Java - ATM 银行登录,尝试 3 次密码锁,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/68134810/

相关文章:

java - 为什么 spring mvc 在自己的 session 中存储对象

java - 预期在单线程上有序执行

java - 如何使用 Java 登录网站并保持登录状态?

c# - 如何在 C# AspNetCore 网站中使用 JWT JSON Web Tokens?

c++ - 如何更改控制台字体?

java - SLF4J Logger 有时会清除控制台输出(不需要)

java - 创建位矩阵和扫描集列的有效方法

java - LinearLayout 内的 fragment - Android

apache - ReSTLer ssl https 重定向

windows - 没有管理员权限运行jar文件