Java小程序报错,怎样解决?
import java.util.Scanner;
public class ATM {
public int c;

Scanner in=new Scanner(System.in);
Account aa[]=new Account[10];

int s[]={101,102,103,104,105,106,107,108,109,110};
public ATM()
{
 for(int i=0;i<=9;i++)
{
 aa[i]=new Account();
 aa[i].setbal(100);
 aa[i].setac(s[i]);
 }
}
public void login()
{

int s=0;
while(true)
{
  System.out.println("请输入你的账号:");
  c=in.nextInt();
for(int i=0;i<=9;i++)
{
 if(c==this.aa[i].getac())
{
  s++;
  return ;
}
}
if(s==0)
{
System.out.println("账号错误!");
}
}
}
public void menu(int b)
{

System.out.println("1.查询余额\r\n2.取款\r\n3.存款\r\n4.退出");
System.out.println("请输入你的选择:");
int a=in.nextInt();
System.out.println("欢迎!");
 switch(a)
 {
 case 1:System.out.println("你的账户余额为:"+this.aa[b].getbal());break; 
 case 2:this.aa[b].withdraw();break;
 case 3:this.aa[b].deposit();break;
 case 4:return;
 }
}


public static void main(String args[])
{
 ATM cc=new ATM();
 while(true){
     cc.login();

     cc.menu(cc.c);

 }
}
}       

Exception in thread "main" java.lang.ArrayIndexOutOfBoundsException: 105
at exp4.ATM.menu(ATM.java:51)
at exp4.ATM.main(ATM.java:63)

4个回答

aa最大长度是10,而b是aa的第b+1个元素。而你把账号直接数组的第i-1个元素了所以会越界
楼主可以考虑拿s[i]去对比账号值,这样就不会报错了

你的问题是访问某个帐号的方法直接用了aa[b],而b是帐号,而不是该帐号在数组中的下标的啊。
应该修正为:用c记录该帐号的下标,临时定义一个变量结束帐号,找到了就设置c为该帐号下标。修改login代码如下,OK。

 public void login() {

        int s = 0;
        while (true) {
            System.out.println("请输入你的账号:");
            int c = in.nextInt();
            for (int i = 0; i <= 9; i++) {
                if (c == this.aa[i].getac()) {
                    s++;
                    this.c = i;//记录下标
                    return;
                }
            }
            if (s == 0) {
                System.out.println("账号错误!");
            }
        }
    }
 System.out.println("请输入你的账号:");
  c=in.nextInt();
    你输入了什么,是0-9之间的数字么

上面几位说的基本都对,不过我觉得楼主这段代码最大的问题是没有很好的使用面向对象的设计方式,部分代码及操作流程不够合理
稍微改动了其中一小部分:

 package test;

import java.util.Scanner;

public class ATM {
    public int c;

    Scanner in = new Scanner(System.in);
    Account aa[] = new Account[10];

    int s[] = { 101, 102, 103, 104, 105, 106, 107, 108, 109, 110 };

    public ATM() {
        for (int i = 0; i <= 9; i++) {
            aa[i] = new Account();
            aa[i].setbal(100);
            aa[i].setac(s[i]);
        }
    }

    public Account login() {
        while (true) {
            System.out.println("请输入你的账号:");
            c = in.nextInt();
            for (int i = 0; i <= 9; i++) {
                if (c == this.aa[i].getac()) {
                    return aa[i];
                }
            }

            return null;
        }
    }

    public boolean menu(Account account, int b) {

        System.out.println("1.查询余额\r\n2.取款\r\n3.存款\r\n4.退出");
        System.out.println("请输入你的选择:");
        int a = in.nextInt();
        System.out.println("欢迎!");
        switch (a) {
            case 1:
                System.out.println("你的账户余额为:" + account.getbal());
                break;
            case 2:
                account.withdraw();
                break;
            case 3:
                account.deposit();
                break;
            case 4:
                return false;
            default:
                System.out.println("输入错误,请重试:");
                break;
        }
        return true;
    }

    public static void main(String args[]) {
        ATM cc = new ATM();
        Account account = null;
        while (true) {
            if (account == null)
                account = cc.login();
            if (account == null)
                System.out.println("账号错误!");
            else
                if (!cc.menu(account, cc.c))
                    account = null;
        }
    }
}

seeze
Zedee public Account login() { 里的while也应去掉
3 年多之前 回复
Csdn user default icon
上传中...
上传图片
插入图片
抄袭、复制答案,以达到刷声望分或其他目的的行为,在CSDN问答是严格禁止的,一经发现立刻封号。是时候展现真正的技术了!
立即提问
相关内容推荐