You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.28 02:36:04