Java程序数组越界问题,请各路高手指点 15
packagemrh;importjava.io.File;importmrh.util.FileReaderUtil;importmrh.util.RandomUtil...
package mrh;
import java.io.File;
import mrh.util.FileReaderUtil;
import mrh.util.RandomUtil;
public class Grouping {
public static void main(String[] args) {
Grouping h = new Grouping();
// 1. 从指定文件中读取包含学生姓名及学号的数组
String[] students = h.getStudents(new File("list.txt"));
// 2. 对学生数组students进行随机排序
students = h.group(students);
// 3. 打印出分组信息
h.printGroupingInfo(students, 3);
}
// 从指定文件中读取包含学生姓名及学号的数组
public String[] getStudents(File listFile) {
FileReaderUtil fru = new FileReaderUtil(listFile);
String[] students = fru.readLines();
return students;
}
// 对学生数组students进行排序, 随机数可以利用RandomUtil的generatInt(int max)产生
public String[] group(String[] students) {
int g = RandomUtil.generatInt(students.length - 1);
int m=0;
for (;m<=g;m++){
int i = 0;
int j = 0;
String[] stu1 = new String[students.length];
while (i<=28){
j = 2*i;
stu1[j] = students[i];
i++;
}
int k = (students.length-1)/2;
for (; i < students.length; i++) {
for (;k>=0;k++){
j=i-k;
stu1[j] = students[i];
}
}
while (j<=28){
i=2*j+1;
students[i]=stu1[j];
j++;
}
int n = (students.length+1)/2;
for (; j < stu1.length; j++) {
for (;n>=0;n--){
i=j-n;
students[i] = stu1[j];
}
}
}
return students;
}
// 打印出分组信息
public void printGroupingInfo(String[] students, int countMember) {
int u=1;
int i=0;
while ( u<=students.length/3){
System.out.println("第"+u+"组:");
for (; i < 3*u; i++) {
System.out.println(students[i]);
}
u++;
}
}
}
Exception in thread "main" java.lang.ArrayIndexOutOfBoundsException: -1
at mrh.Grouping.group(Grouping.java:45)
at mrh.Grouping.main(Grouping.java:13)
就是 students = h.group(students);
stu1[j] = students[i];
students = h.group(students);这三个地方显示有问题 展开
import java.io.File;
import mrh.util.FileReaderUtil;
import mrh.util.RandomUtil;
public class Grouping {
public static void main(String[] args) {
Grouping h = new Grouping();
// 1. 从指定文件中读取包含学生姓名及学号的数组
String[] students = h.getStudents(new File("list.txt"));
// 2. 对学生数组students进行随机排序
students = h.group(students);
// 3. 打印出分组信息
h.printGroupingInfo(students, 3);
}
// 从指定文件中读取包含学生姓名及学号的数组
public String[] getStudents(File listFile) {
FileReaderUtil fru = new FileReaderUtil(listFile);
String[] students = fru.readLines();
return students;
}
// 对学生数组students进行排序, 随机数可以利用RandomUtil的generatInt(int max)产生
public String[] group(String[] students) {
int g = RandomUtil.generatInt(students.length - 1);
int m=0;
for (;m<=g;m++){
int i = 0;
int j = 0;
String[] stu1 = new String[students.length];
while (i<=28){
j = 2*i;
stu1[j] = students[i];
i++;
}
int k = (students.length-1)/2;
for (; i < students.length; i++) {
for (;k>=0;k++){
j=i-k;
stu1[j] = students[i];
}
}
while (j<=28){
i=2*j+1;
students[i]=stu1[j];
j++;
}
int n = (students.length+1)/2;
for (; j < stu1.length; j++) {
for (;n>=0;n--){
i=j-n;
students[i] = stu1[j];
}
}
}
return students;
}
// 打印出分组信息
public void printGroupingInfo(String[] students, int countMember) {
int u=1;
int i=0;
while ( u<=students.length/3){
System.out.println("第"+u+"组:");
for (; i < 3*u; i++) {
System.out.println(students[i]);
}
u++;
}
}
}
Exception in thread "main" java.lang.ArrayIndexOutOfBoundsException: -1
at mrh.Grouping.group(Grouping.java:45)
at mrh.Grouping.main(Grouping.java:13)
就是 students = h.group(students);
stu1[j] = students[i];
students = h.group(students);这三个地方显示有问题 展开
7个回答
展开全部
这个异常相信很多朋友也经常遇到过,异常的解释是"数组下标越界",现在程序中大多都有对数组的操作,因此在调用数组的时候一定要认真检查,看自己调用的下标是不是超出了数组的范围,一般来说,显示(即直接用常数当下标)调用不太容易出这样的错,但隐式(即用变量表示下标)调用就经常出错了,还有一种情况,是程序中定义的数组的长度是通过某些特定方法决定的,不是事先声明的,这个时候,最好先查看一下数组的length,以免出现这个异常。
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
你先在
// 1. 从指定文件中读取包含学生姓名及学号的数组
String[] students = h.getStudents(new File("list.txt"));
把studens数组打印出来看看,是不是和你的list.txt文件的内容相同
在就是看看student.length是多少
// 1. 从指定文件中读取包含学生姓名及学号的数组
String[] students = h.getStudents(new File("list.txt"));
把studens数组打印出来看看,是不是和你的list.txt文件的内容相同
在就是看看student.length是多少
追问
请问 // 2. 对学生数组students进行随机排序
students = h.group(students);
这一步对应的下面的分组方法对么?
还有这里 for (; i =0;k++){
j=i-k;
stu1[j] = students[i];
上一步While中将一个数组值赋给另个数组正确,但下一个就是这里Eclipse就显示错误了,这是什么原因啊
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
实际的文件中有没有读至少58个学生信息呢? 代码中的 j<=28 等28不知道是什么意思,最好定义一个有意义常量来表示。
追问
list文件中只有57个人,算法设计思路是跟洗牌一样,57个人,数组中间的那个数是28。0到28之间有28个空,刚好可以将后面的28个查到前面的28个空中,就跟将一副牌从中间对折,然后2部分互相插空一样
追答
while (j<=28){
i=2*j+1;
students[i]=stu1[j];
j++;
}
如果只有57人,那此处j=28时,students[57] 不就越界了吗?
本回答被网友采纳
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
应该是没有从文件中读到信息吧。
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
就是可能在stu1[j] = students[i]; 这里可能有问题
追问
将一个数组第i位赋值给另一个数组的第j位可以这样写吧
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询