Java编写ATM程序时报错非静态变量无法从静态上下文引用求助
错误原因
- 你代码中定义的
initBalance、kbd都是非静态成员变量,属于类的实例对象,只有创建了ATM类的实例之后才能访问 main、withdraw、deposit等方法都加了static修饰,静态方法属于类本身,类加载时就已经存在,此时还没有生成类的实例,因此在静态方法中直接访问非静态成员变量就会触发该报错。
修复方案
推荐采用符合面向对象规范的修改方式:移除业务方法的static修饰,在main方法中先创建ATM类的实例,再通过实例调用业务方法。同时修复代码中两个隐藏的逻辑问题:
- 原循环没有重新读取用户操作编号,会导致进入操作后无限循环
- 取款、转账的余额判断条件写反,原代码是取款/转账金额大于余额才允许操作,逻辑完全颠倒
修改后的完整代码如下:
import java.util.Scanner; public class ATM { Scanner kbd = new Scanner(System.in); int initBalance = 0; public static void main(String[] args) { ATM atm = new ATM(); while (true) { System.out.print("\n---------------------ATM----------------\n1. Withdraw\n2. Deposit\n3. Transfer\n4. Check balance\n5. EXIT"); System.out.print("\nChoose operation: "); int option = atm.kbd.nextInt(); if (option == 5) { System.out.print("\nThank you for using this ATM!"); break; } switch (option) { case 1: atm.withdraw(); break; case 2: atm.deposit(); break; case 3: atm.transfer(); break; case 4: atm.balanceCheck(); break; default: System.out.print("Number not in the option."); } } } public void withdraw() { System.out.print("Enter amount to be withdrawn: "); int withdrawBalance = kbd.nextInt(); if (withdrawBalance <= initBalance) { System.out.print("Collect your money."); initBalance = initBalance - withdrawBalance; System.out.print("\nCheck balance? 1. Yes 2. No : "); int balanceOption = kbd.nextInt(); if (balanceOption == 1) { System.out.print("Remaining balance: " + initBalance); } } else { System.out.print("Insufficient Balance"); } } public void deposit() { System.out.print("Enter amount you want to deposit: "); int depositBalance = kbd.nextInt(); initBalance = initBalance + depositBalance; System.out.print("\nCheck balance? 1. Yes 2. No : "); int balanceOption = kbd.nextInt(); if (balanceOption == 1) System.out.print("Remaining balance: " + initBalance); else if(balanceOption == 2) System.out.print("\nThank you for using this ATM!"); else System.out.print("Number not in the option."); } public void transfer() { System.out.print("Enter Account number: "); int accNum = kbd.nextInt(); System.out.print("Enter amount to be transferred: "); int moneySent = kbd.nextInt(); if(moneySent <= initBalance) { System.out.print("Transfer Success!"); initBalance = initBalance - moneySent; System.out.print("\nCheck balance? 1. Yes 2. No : "); int balanceOption = kbd.nextInt(); if (balanceOption == 1) System.out.print("Remaining balance: " + initBalance); else if(balanceOption == 2) System.out.print("\nThank you for using this ATM!"); else System.out.print("Number not in the option."); } else { System.out.print("Insufficient Balance"); } } public void balanceCheck() { System.out.print("Remaining balance: " + initBalance); } }
内容的提问来源于stack exchange,提问作者Jason Wobblewitz
相关产品推荐
相关产品推荐

