Java 数组索引越界异常

Java 数组索引越界异常,java,arrays,Java,Arrays,问题是: 在辍学期结束后更新学生成绩列表的程序。程序应该读取放弃的学生的用户数量及其索引,然后程序应该将剩余学生的成绩复制到新数组中。此外,程序应同时显示原始列表和更新列表。[提示:新数组的长度必须与剩余学生数相等] 我的代码: public class Q5{ static Scanner scan = new Scanner (System.in); public static void main (String args[]){ double [] list={1 ,2

问题是:

在辍学期结束后更新学生成绩列表的程序。程序应该读取放弃的学生的用户数量及其索引,然后程序应该将剩余学生的成绩复制到新数组中。此外,程序应同时显示原始列表和更新列表。[提示:新数组的长度必须与剩余学生数相等]

我的代码:

public class Q5{
  static Scanner scan = new Scanner (System.in);
  public static void main (String args[]){

    double [] list={1 ,2 ,3 ,4 ,5 ,6 ,7 ,8 ,9 ,10};
    System.out.println("enter number of students who dropped:");
    int num=scan.nextInt();
    double [] list2 = new double [num];

    System.out.println("Enter index Of  the student who dropped ");
    for (int j=1 ; j<=num ; j++)
    {
      System.out.println("student" + j + ":");
      int index=scan.nextInt();
      list[index]=0;
    }

    int  j=0;
    for(int i=0; i<list.length ; i++)
    if (list[i]!=0)
    {
      list2[j]=list[i];
      j++;
    }
    System.out.print("The original list : " );
    for(int i=0; i<list.length ; i++)
    System.out.print(list[i] + " " );

    System.out.print("remaining students " );
    for(int i=0; i<list2.length ; i++)
    System.out.print(list2[i] + " " );
  }
}
公共类Q5{
静态扫描仪扫描=新扫描仪(System.in);
公共静态void main(字符串参数[]){
double[]list={1,2,3,4,5,6,7,8,9,10};
System.out.println(“输入辍学的学生人数:”);
int num=scan.nextInt();
double[]list2=新的双精度[num];
System.out.println(“输入辍学学生的索引”);

对于(int j=1;j这是因为
列表2的大小

您不应该将其大小设置为
num
,而应该设置为原始列表的大小。因为
list2
将包含与原始
列表一样多的元素。您只需要
num
从用户获取那么多输入,并将这些索引的值指定为0

如果不需要保留原始大小,则需要从原始大小中减去num,如所建议的


如果用户输入的值超出数组的界限,则代码将失败:

int index=scan.nextInt();
list[index]=0; // This may fail. Value entered by the user may exceed the array length
伪代码:

您从10名学生开始。假设您想删除2名学生。这意味着您将
list2
大小设置为2

接下来,您要做的是尝试将所有学生(10)从
列表添加到
列表2
。但是,
列表2
太小,因此您会得到异常

你想要的是:

double [] list2 = new double [list.length - num];

猜测预定义数组“list”的问题

步骤1:使用其中一种初始化方法创建列表。这里的大小是固定的

步骤2:从用户处获取输入:假设它是11


列表不需要包含作为输入给定的大小。

您使用错误的大小初始化
list2

您可以从已删除的学生的用户编号中获取,然后尝试将所有剩余的学生放入
list2

double [] list2 = new double [list.length - num];
工作正常

导入java.util.Scanner

public class Q5 {
    static Scanner scan = new Scanner(System.in);

    public static void main(String args[]) {

        double[] list = { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 };
        System.out.println("enter number of students who dropped:");
        int num = scan.nextInt();
        double[] list2 = new double[num - 1]; // should be num-1

        System.out.println("Enter index Of  the student who dropped ");
        for (int j = 0; j < num; j++) {
            System.out.println("student" + j + ":");
            int index = scan.nextInt();
            list[index] = 0;
        }

        int j = 0;
        for (int i = 0; i < num; i++) {
            if (list[i] != 0) {
                list2[j] = list[i];
                j++;
            }
        }
        System.out.print("The original list : ");
        for (int i = 0; i < list.length; i++) {
            System.out.print(list[i] + " ");
        }

        System.out.print("remaining students ");
        for (int i = 0; i < list2.length; i++) {
            System.out.print(list2[i] + " ");
        }
    }
}

这将删除您得到的异常。从下一次开始,您不使用静态值

编辑: 自行为任何变量赋值不是一个好做法。因为数组的大小为10。如果用户输入的值超过10个,则会导致问题

import java.util.*;

public class Q5 {
    static Scanner scan = new Scanner(System.in);

    public static void main(String args[]) {

        double[] list = { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 };
        System.out.println("enter number of students who dropped:");
        int num = scan.nextInt();
        double[] list2 = new double[list.length-num]; // should be num-1

        System.out.println("Enter index Of  the student who dropped ");
        for (int j = 0; j < num; j++) {
            System.out.println("student" + j + ":");
            int index = scan.nextInt();
            list[index] = 0;
        }

        int j = 0;
        for (int i = 0; i < list.length; i++) {
            System.err.println(""+list[i]);
            if (list[i] > 0) {

                list2[j] = list[i];
                j++;
            }
        }
        System.out.print("The original list : ");
        for (int i = 0; i < list.length; i++) {
            System.out.print(list[i] + " ");
        }

        System.out.print("remaining students ");
        for (int i = 0; i < list2.length; i++) {
            System.out.print(list2[i] + " ");
        }
    }
}
import java.util.*;
公开课Q5{
静态扫描仪扫描=新扫描仪(System.in);
公共静态void main(字符串参数[]){
double[]list={1,2,3,4,5,6,7,8,9,10};
System.out.println(“输入辍学的学生人数:”);
int num=scan.nextInt();
double[]list2=new double[list.length num];//应为num-1
System.out.println(“输入辍学学生的索引”);
对于(int j=0;j0){
列表2[j]=列表[i];
j++;
}
}
系统输出打印(“原始列表:”);
for(int i=0;i
请粘贴错误的堆栈跟踪。请帮那些试图帮你一个小忙的人一个小忙:你说它不工作到底是什么意思?如果你粘贴在控制台中打印的错误就好了。请注意,既然我引入了一致的缩进,那么阅读代码就容易多了。这不完全是2cz用户将输入dropped@Walaa我举一个例子,用文字而不是代码来说明正在发生的事情。然后你可以看到哪里出了问题。差不多。
double[]list2=newdouble[list.length-num]
好的,差不多可以了,但这是输出输入辍学学生人数:4输入辍学学生索引1:1学生2:2学生3:3学生4:4原始列表:1 0 0 0 6 7 8 9 10剩余学生1 6 7 8 9 10 0 0 0 00@Joetjah-谢谢。我编辑了答案。瓦拉,这个编辑应该会修复数组长度问题,以及AIOOBE。我的意思是这样做有风险。相反,在尝试从数组中访问值之前,请始终进行检查(因为用户输入的值可能超过数组长度)为什么是-1?解释你的答案。如果给定的2个学生意味着数组的大小应该是1。对!数组索引从0开始,因为学生的第一次索引是1,第二次索引也是1。为什么?我说的对吗?不是要问你减少了多少学生,而是要问学生减少了多少学生?@joet ya u r正确..查看我的编辑如果我理解正确,它对id 2工作正常我理解你的编辑,但是代码如何解决这个问题?如果用户输入12怎么办?
double[-list2=new double[list.length num];
将是
double[-2]
…这就是为什么我在那里提到不要提前指定值。@Walaa您会遇到此错误,因为您已经提前指定了列表的大小。或者您可以向用户提供输入小于列表长度的学生人数的权限。@length()
public class Q5 {
    static Scanner scan = new Scanner(System.in);

    public static void main(String args[]) {

        double[] list = { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 };
        System.out.println("enter number of students who dropped:");
        int num = scan.nextInt();
        double[] list2 = new double[num - 1]; // should be num-1

        System.out.println("Enter index Of  the student who dropped ");
        for (int j = 0; j < num; j++) {
            System.out.println("student" + j + ":");
            int index = scan.nextInt();
            list[index] = 0;
        }

        int j = 0;
        for (int i = 0; i < num; i++) {
            if (list[i] != 0) {
                list2[j] = list[i];
                j++;
            }
        }
        System.out.print("The original list : ");
        for (int i = 0; i < list.length; i++) {
            System.out.print(list[i] + " ");
        }

        System.out.print("remaining students ");
        for (int i = 0; i < list2.length; i++) {
            System.out.print(list2[i] + " ");
        }
    }
}
 enter number of students who dropped:
    2
    Enter index Of  the student who dropped 
    student0:
    1
    student1:
     2
    The original list : 1.0 0.0 0.0 4.0 5.0 6.0 7.0 8.0 9.0 10.0 remaining students 1.0 
import java.util.*;

public class Q5 {
    static Scanner scan = new Scanner(System.in);

    public static void main(String args[]) {

        double[] list = { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 };
        System.out.println("enter number of students who dropped:");
        int num = scan.nextInt();
        double[] list2 = new double[list.length-num]; // should be num-1

        System.out.println("Enter index Of  the student who dropped ");
        for (int j = 0; j < num; j++) {
            System.out.println("student" + j + ":");
            int index = scan.nextInt();
            list[index] = 0;
        }

        int j = 0;
        for (int i = 0; i < list.length; i++) {
            System.err.println(""+list[i]);
            if (list[i] > 0) {

                list2[j] = list[i];
                j++;
            }
        }
        System.out.print("The original list : ");
        for (int i = 0; i < list.length; i++) {
            System.out.print(list[i] + " ");
        }

        System.out.print("remaining students ");
        for (int i = 0; i < list2.length; i++) {
            System.out.print(list2[i] + " ");
        }
    }
}