Cc-282 2023-01-08 22:00 采纳率: 40%
浏览 102
已结题

Index 1 out of bounds for length 1

在解决完之前的问题后,又出现了相同的错误提示,只是错误的位置改变了,但数组越界,我不理解,在定义时已经是定义过了

img


package ManagementSystem;
import java.util.*;
public class system { 
    private static final int MAXITEM=3;
    private static final int MAXNUMBER=100;
        public static void main(String[] args) {
            Athlete[][] man=new Athlete[MAXITEM][MAXNUMBER]; 
            Recorder re1=new Recorder("李文",23.4);          //保持项目的纪录
            Recorder re2=new Recorder("冯伟",23.39);       
            Recorder re3=new Recorder("戴瑞",5.33);
            int n[]=new int[3];
            Scanner sc=new Scanner(System.in);
            while(true) {             //循环菜单界面
                
                System.out.println("\n-------------菜单(menu)-------------");
                System.out.println("1.录入运动员成绩;");
                System.out.println("2.每个项目的平均成绩、最好成绩以及最差成绩;");
                System.out.println("3.每个项目的成绩按降序排序;");
                System.out.println("4.判断每个项目是否有破纪录的运动员;");
                System.out.println("5.查询运动员成绩。");
                System.out.println("\n*请输入对应序号,进入功能。输入0结束运行");
                System.out.println("------------------------------------");
                int choice=sc.nextInt();         //输入选择的功能
                int i,j;
                switch(choice) {
                case 0:
                    System.exit(0);
                    break;
//成绩录入
                case 1:
                    System.out.println("\n---------------录入成绩---------------");
                    for(i=0;i<3;i++) {
                        System.out.print("请输入要录入项目"+(i+1)+"的人数:");
                        
                        n[i]=sc.nextInt();
                        System.out.println("          ------项目"+(i+1)+"------");
                        if(i==1)
                            System.out.println("参赛号码 姓名 成绩(s)");
                        else
                            System.out.println("参赛号码 姓名 成绩(m)");
                        for(j=0;j<n[i];j++) {
                            Athlete athlete=new Athlete();
                            String s=sc.nextLine();    //获取用户输入
                            String[] s1=s.split(" ");       //通过split切割字符串,按行读取数据,用空格分隔1
                            athlete.SetNumber(s1[0]);    
                            athlete.SetName(s1[1]);
                            athlete.SetGrade(Double.parseDouble(s1[2]));
                            man[i][j]=athlete;             //将输入的数据保存到运动员数组中
                        }
                    }
                    System.out.println("\n---------------录入成绩---------------");
                    break;
//成绩计算
                case 2:
                    double ave=0,best=0,worse;   
                    System.out.println("\n---------------计算成绩---------------");
                    System.out.println("\n项目 平均成绩 最好成绩 最差成绩");
                    for(i=0;i<3;i++) {
                        worse=man[i][0].GetGrade();
                        j=0;
                        for(j=0;j<n[i];j++) {
                            ave+=man[i][j].GetGrade();
                            if(best<man[i][j].GetGrade() && i!=1)      //求最好成绩
                                best=man[i][j].GetGrade();
                            else if(best>man[i][j].GetGrade() && i==1)
                                best=man[i][j].GetGrade();
                            if(worse>man[i][j].GetGrade() && i!=1)     //求最差成绩
                                worse=man[i][j].GetGrade();
                            else if(best>man[i][j].GetGrade() && i==1)
                                best=man[i][j].GetGrade();
                        }
                        ave=ave/n[i];
                        System.out.println((i+1)+"  "+String.format("%.2f", ave)+" "+String.format("%.2f", best)+" "+String.format("%.2f", worse));    
                    }
                    System.out.println("\n---------------计算成绩---------------");
                    break;
//成绩排序
                case 3:
                    int k,l;
                    System.out.println("\n---------------成绩排序---------------");           //选择排序
                    for(i=0;i<3;i++) {
                        System.out.println("          ------项目"+(i+1)+"------");
                        if(i==1)
                            System.out.println("参赛号码 姓名 成绩(s)");
                        else
                            System.out.println("参赛号码 姓名 成绩(m)");
                        for(j=0;j<n[i]-1;j++) {
                            k=j;
                            for(l=j+1;l<n[i];l++) {
                                if(man[i][j].GetGrade()<man[i][l].GetGrade() && i!=1) 
                                    k=l;
                                else if(man[i][j].GetGrade()>man[i][l].GetGrade() && i==1)
                                    k=l;
                            }
                            if(k!=j) {
                                Athlete ath=new Athlete();
                                ath=man[i][j];
                                man[i][j]=man[i][k];
                                man[i][k]=ath;
                            }
                                System.out.println(man[i][j].GetNumber()+" "+man[i][j].GetName()+" "+String.format("%.2f",man[i][j].GetGrade()));
                        }
                               System.out.println(man[i][j].GetNumber()+" "+man[i][j].GetName()+" "+String.format("%.2f",man[i][j].GetGrade()));
                    }
                    System.out.println("\n---------------成绩排序---------------");
                    break;
//破纪录
                case 4:
                    System.out.println("\n--------------是否破纪录?--------------");
                    System.out.println("纪录保持者:\n项目一:"+re1.GetMname()+" "+String.format("%.2f", re1.GetRecord()));
                    System.out.println("项目二:"+re2.GetMname()+" "+String.format("%.2f", re2.GetRecord()));
                    System.out.println("项目三:"+re3.GetMname()+" "+String.format("%.2f", re3.GetRecord()));
                    for(i=0;i<3;i++) {
                        for(j=0;j<n[i];j++) {
                            if(man[i][j].GetGrade()>re1.GetRecord() && i==0 || man[i][j].GetGrade()>re3.GetRecord() && i==2) {
                                if(i==0) {
                                    re1.SetMname(man[i][j].GetName());re1.SetRecord(man[i][j].GetGrade());
                                }
                                else {
                                    re3.SetMname(man[i][j].GetName());re3.SetRecord(man[i][j].GetGrade());
                                }
                                System.out.println("项目"+(i+1)+"有破纪录者:"+man[i][j].GetNumber()+" "+man[i][j].GetName()+" "+String.format("%.2f", man[i][j].GetGrade()));
                            }
                                else if(man[i][j].GetGrade()<re2.GetRecord() && i==1) {
                                    re2.SetMname(man[i][j].GetName());re2.SetRecord(man[i][j].GetGrade());
                                    System.out.println("项目"+(i+1)+"有破纪录者:"+man[i][j].GetNumber()+" "+man[i][j].GetName()+" "+String.format("%.2f", man[i][j].GetGrade()));
                                    }
                                else
                                    System.out.println("项目"+(i+1)+"没破记录");
                        }
                    }
                    System.out.println("\n--------------是否破纪录?--------------");
                    break;
//查询
                case 5:
                    int c=0,num=0;
                    while(c==0) {
                        System.out.println("\n---------------查询成绩---------------");
                        System.out.print("请输入参赛号码:");
                        String s=sc.next();
                        for(i=0;i<3;i++) {
                            for(j=0;j<n[i];j++) {
                                if(man[i][j].GetNumber().equals(s)) {
                                    System.out.println(man[i][j].GetNumber()+" "+man[i][j].GetName()+" "+man[i][j].GetGrade());
                                    num++;
                                }
                            }
                        }
                        if(i==4 && num==0)
                            System.out.println("该参赛号码不存在!!!");
                        System.out.println("\n---------------查询成绩---------------");
                        System.out.println("\n*继续查询0/返回菜单1");
                        c=sc.nextInt();
                    }
                    break;
                default:
                    System.out.println("输入错误!!请重新输入!!!");
                    break;
                }
            }
        }
}
 
package ManagementSystem;
public class Athlete{                      //运动员类
    private String name,number;             //运动员姓名、参赛号码
    private double grade;                   //运动员成绩
    public void SetName(String name) {           //设置姓名
        this.name=name;
    }
    public void SetNumber(String number) {      //设置参赛号码
        this.number=number;
    }
    public void SetGrade(double grade) {         //设置成绩
        this.grade=grade;
    }
    public String GetName() {                    //获取姓名
        return name;
    }
    public String GetNumber() {                  //获取参赛号码
        return number;
    }
    public double GetGrade() {                  //获取成绩
        return grade;
    }
}
 
package ManagementSystem;
 
public class Recorder {
    private String mname;
    private double record;
    Recorder(String mname,double record) {
        this.mname=mname;
        this.record=record;
    }
    public void SetMname(String mname) {
        this.mname=mname;
    }
    public void SetRecord(double record) {
        this.record=record;
    }
    public String GetMname() {
        return mname;
    }
    public double GetRecord() {
        return record;
    }
}

  • 写回答

3条回答 默认 最新

  • Huazie 全栈领域优质创作者 2023-01-08 22:24
    关注
    • 这种报错都已经给你了, 堆栈代码行数也列了46行, 你在那一行打个断点,debug去跑就知道 为啥 数组越界了

    img

    • next 遇到空格,换行就会停止, 你无法得到你想要的 3个按空格分隔的数; next() 换成 nextLine() 读取一行

    img

    • 换成 nextLine() 就会 把上面 nextInt() 的换行吃掉,所以你要 在之前再用一次 nextLine() 接收一下换行

    img

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论 编辑记录
查看更多回答(2条)

报告相同问题?

问题事件

  • 已结题 (查看结题原因) 1月9日
  • 已采纳回答 1月8日
  • 修改了问题 1月8日
  • 修改了问题 1月8日
  • 展开全部

悬赏问题

  • ¥15 关于#matlab#的问题:在模糊控制器中选出线路信息,在simulink中根据线路信息生成速度时间目标曲线(初速度为20m/s,15秒后减为0的速度时间图像)我想问线路信息是什么
  • ¥15 banner广告展示设置多少时间不怎么会消耗用户价值
  • ¥16 mybatis的代理对象无法通过@Autowired装填
  • ¥15 可见光定位matlab仿真
  • ¥15 arduino 四自由度机械臂
  • ¥15 wordpress 产品图片 GIF 没法显示
  • ¥15 求三国群英传pl国战时间的修改方法
  • ¥15 matlab代码代写,需写出详细代码,代价私
  • ¥15 ROS系统搭建请教(跨境电商用途)
  • ¥15 AIC3204的示例代码有吗,想用AIC3204测量血氧,找不到相关的代码。