Java求助,关于越界问题

Kathrains 2016-10-17 04:35:46
Java入门新手, 目前跟它还处于磨合期……这段时间在编写一个简单的学生管理,但是有一个BUG我实在是搞不明白。
问题出现在学生添加的函数boolean add(Student stu)部分,一运行就报错。
Exception in thread "main" java.lang.ArrayIndexOutOfBoundsException: 1
at text.studentList.add(Text.java:58)
at text.Text.main(Text.java:103)
但是我不知道数组到底是哪里越界了……
请求各位高手指教,谢谢了

package text;
import java.io.*;

class Student
{
private String studentName;
private String studentNumber;
private int markForMaths = -1;
private int markForEnglish = -1;
private int markForScience = -1;

Student(){};
Student(String number, String name)
{
studentNumber = number;
studentName = name;
}

String getName(){ return studentName; }
String getNumber() { return studentNumber; }
void enterMarks(int Math, int English, int Science)
{
markForMaths = Math;
markForEnglish = English;
markForScience = Science;
}

int getMathsMark() { return markForMaths; }
int getEnglishMark() { return markForEnglish; }
int getScienceMark() { return markForScience; }
String getStudentNumber() { return studentNumber; }

double calculateAverage()
{
double markForAverage;
markForAverage = (markForMaths + markForScience + markForEnglish)/3.0;
return markForAverage;
}

String toStrings()
{
return "学号:"+studentNumber+"\n"+"学生姓名:"+studentName+"\n"+"数学成绩:"+markForMaths+"\n"+"英语成绩:"+markForEnglish+"\n"+"科学成绩:"+markForScience+"\n"+"平均成绩:"+calculateAverage();
}
}

class studentList
{
private int len;
private Student[] list = new Student[len]; //这里len的值为100,main里有一条语句。debug时也显示len=100
private int total = 0;

studentList(int length){len = length;}
boolean add(Student stu)
{
if(total <= len)
{
total++;
list[total]= stu; //就是这里!明明total=1啊 = =
return true;
}
else
return false;

}

void ShowAll()
{
for(int i = 1; i <= total; i++)
{
list[i].toStrings();
}
}
}

public class Text {

public static void main(String[] args) throws IOException {

BufferedReader Buf = new BufferedReader(new InputStreamReader(System.in));
studentList List;
List = new studentList(100);

String name = null;
String number = null;
int math, english, science;
boolean flag;

System.out.println("请输入学生学号:");
number = Buf.readLine();
System.out.println("请输入学生姓名:");
name = Buf.readLine();

System.out.println("请输入学生三门课成绩(数学,英语,科学):");
String temp = Buf.readLine();
String[] ss = temp.split(",");
math = Integer.parseInt (ss[0]);
english = Integer.parseInt (ss[1]);
science = Integer.parseInt (ss[2]);

Student stu;
stu = new Student(name, number);
stu.enterMarks(math, english, science);
flag = List.add(stu);

if(flag == true)
{
System.out.println("学生添加成功!");
List.ShowAll();
}
else
System.out.println("学生添加失败!");

}
}
...全文
297 11 打赏 收藏 转发到动态 举报
写回复
用AI写文章
11 条回复
切换为时间正序
请发表友善的回复…
发表回复
逗泥丸的平方 2016-10-17
  • 打赏
  • 举报
回复
引用 9 楼 Ramitutoo 的回复:
我看Java代码封装得很好,所以以为没有全局变量的存在…… total改为静态变量后问题已经解决,多谢指教!
这种情况感觉完全用不到静态变量呢 .. 你的对象应该是一个list吧,长度应该是每个对象的属性,而不是整个类的属性
Kathrains 2016-10-17
  • 打赏
  • 举报
回复
引用 2 楼 a327369238 的回复:
2楼正解,类加载初始化顺序搞错了你
初始化顺序一直是硬伤……
Kathrains 2016-10-17
  • 打赏
  • 举报
回复
引用 6 楼 u014181631 的回复:
[quote=引用 4 楼 Ramitutoo 的回复:] [quote=引用 1 楼 abcdefghiijklmnopqrs 的回复:]
private Student[] list;
49行
studentList(int length){len = length;list = new Student[len];}
52行
谢谢大神。 还有一个问题就是要求用total来统计学生人数,add只是switch-case语句里面的一个分支。当我添加完毕跳出分支,然后再进入的时候。total又变成了0……该如何才能统计到总人数信息呢?Java又不能用全局变量 = =[/quote] java也有全局变量啊[/quote] 我看Java代码封装得很好,所以以为没有全局变量的存在…… total改为静态变量后问题已经解决,多谢指教!
Kathrains 2016-10-17
  • 打赏
  • 举报
回复
引用 7 楼 qq_35209952 的回复:
[quote=引用 4 楼 Ramitutoo 的回复:] 谢谢大神。 还有一个问题就是要求用total来统计学生人数,add只是switch-case语句里面的一个分支。当我添加完毕跳出分支,然后再进入的时候。total又变成了0……该如何才能统计到总人数信息呢?Java又不能用全局变量 = =
total怎么会又变成0呢. 这是你的list的属性. List.add 我看到你的代码里只用到了一次. 所以total也就是1了.. 你可以debug看一下...List.len 对于类成员的操作建议用get/set来控制. 但是length显然是不应该直接设置的,所以只应该有get 还有这里注意一下 studentList List; 类名大写 变量名小写[/quote] 谢谢指教。因为我只是把出问题的部分单独拷了出来,所以add函数在这里只用了一次。 问题已经解决,十分感谢!
逗泥丸的平方 2016-10-17
  • 打赏
  • 举报
回复
引用 4 楼 Ramitutoo 的回复:
谢谢大神。 还有一个问题就是要求用total来统计学生人数,add只是switch-case语句里面的一个分支。当我添加完毕跳出分支,然后再进入的时候。total又变成了0……该如何才能统计到总人数信息呢?Java又不能用全局变量 = =
total怎么会又变成0呢. 这是你的list的属性. List.add 我看到你的代码里只用到了一次. 所以total也就是1了.. 你可以debug看一下...List.len 对于类成员的操作建议用get/set来控制. 但是length显然是不应该直接设置的,所以只应该有get 还有这里注意一下 studentList List; 类名大写 变量名小写
___d 2016-10-17
  • 打赏
  • 举报
回复
引用 4 楼 Ramitutoo 的回复:
[quote=引用 1 楼 abcdefghiijklmnopqrs 的回复:]
private Student[] list;
49行
studentList(int length){len = length;list = new Student[len];}
52行
谢谢大神。 还有一个问题就是要求用total来统计学生人数,add只是switch-case语句里面的一个分支。当我添加完毕跳出分支,然后再进入的时候。total又变成了0……该如何才能统计到总人数信息呢?Java又不能用全局变量 = =[/quote] java也有全局变量啊
___d 2016-10-17
  • 打赏
  • 举报
回复
引用 4 楼 Ramitutoo 的回复:
[quote=引用 1 楼 abcdefghiijklmnopqrs 的回复:]
private Student[] list;
49行
studentList(int length){len = length;list = new Student[len];}
52行
谢谢大神。 还有一个问题就是要求用total来统计学生人数,add只是switch-case语句里面的一个分支。当我添加完毕跳出分支,然后再进入的时候。total又变成了0……该如何才能统计到总人数信息呢?Java又不能用全局变量 = =[/quote] 静态变量
Kathrains 2016-10-17
  • 打赏
  • 举报
回复
引用 1 楼 abcdefghiijklmnopqrs 的回复:
private Student[] list;
49行
studentList(int length){len = length;list = new Student[len];}
52行
谢谢大神。 还有一个问题就是要求用total来统计学生人数,add只是switch-case语句里面的一个分支。当我添加完毕跳出分支,然后再进入的时候。total又变成了0……该如何才能统计到总人数信息呢?Java又不能用全局变量 = =
a327369238 2016-10-17
  • 打赏
  • 举报
回复
引用 2 楼 a327369238 的回复:
2楼正解,类加载初始化顺序搞错了你
好吧,2楼居然是我,是1楼
a327369238 2016-10-17
  • 打赏
  • 举报
回复
2楼正解,类加载初始化顺序搞错了你
  • 打赏
  • 举报
回复
private Student[] list;
49行
studentList(int length){len = length;list = new Student[len];}
52行

50,530

社区成员

发帖
与我相关
我的任务
社区描述
Java相关技术讨论
javaspring bootspring cloud 技术论坛(原bbs)
社区管理员
  • Java相关社区
  • 小虚竹
  • 谙忆
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧