收到错误:线程“main”中的异常 java.lang.ArrayIndexOutOfBoundsException:索引 0 超出长度 0 [duplicate] 的边界

Getting error : Exception in thread "main" java.lang.ArrayIndexOutOfBoundsException: Index 0 out of bounds for length 0 [duplicate]

提问人:BekarBanda 提问时间:3/10/2023 最后编辑:Mark RotteveelBekarBanda 更新时间:3/10/2023 访问量:261

问:

我正在尝试从另一个类(即来自“StudentMarks.class”)获取名称输入。我从主类(即来自“StudentMarks.class”)获取所有用户输入,但声明是在另一个类(即 value.class)中完成的。

虽然我已经初始化了变量大小,这将是我的字符串数组的大小,但在输入用户名时,它输入了错误

Exception in thread "main" java.lang.ArrayIndexOutOfBoundsException: Index 0 out of bounds for length 0
    at studentmarks.StudentMarks.main(StudentMarks.java:53)
System.out.printf("\nEnter names : ");
for(int i=0; i<(mar.size); i++){
    mar.name[i]= sc.nextLine();          // Getting error here
}

我知道这段代码很混乱,因为我正处于学习阶段,我想尝试所有可能的方式来获取输入、生成输出等。通常,我正在试验我的代码。

我的代码在这里

package studentmarks;

import java.util.*;

class value{
    
    int size;   // variable to declare size of my array
    
    String name[]=new String[size];   //take name input from user
    float marks[]= new float[size];   //take marks input from user
    float sum=0;
    
    double total(){     
        for(float i: marks) 
            sum+=i;
        return sum;
    }
    
    double average(){
        return sum/(marks.length);
    }
    
    char grade(){
        if(average()>=90)
            return 'A';
        else if(average()>=80 && average()<90)
            return 'B';
        else
            return 'C';    
    }
}

public class StudentMarks {

       public static void main(String[] args) {
        // TODO code application logic here
        
        Scanner sc=new Scanner(System.in);
        value mar=new value();
        
        System.out.printf("Enter size : ");
        mar.size= sc.nextInt();        // taking user input to define array size declared in value.class
        
        System.out.println(mar.size); // checking size was correctly intitalized or not
        
        System.out.printf("\nEnter names : ");//taking name input here (array was declared in value.class)
        for(int i=0; i<(mar.size); i++){
            mar.name[i]= sc.nextLine();   //Getting array index error here
        }
        
        System.out.printf("\nEnter marks : ");//taking marks input here (array was declared in value.class)

        for(int i=0; i<mar.size; i++){
            mar.marks[i]= sc.nextFloat();
        }
        
        //printing result
        for(String i: mar.name){
            System.out.println(i);
        }
        System.out.println(mar.average());
        System.out.println(mar.grade());
    }
    
}
Java 数组 异常 输入

评论

2赞 Eliahu 3/10/2023
当类通过调用初始化时:类中的字段大小由零初始化,数组的长度为 0。之后,您将分配给从系统输入中读取的值,但它对数组长度没有任何影响,因为它已经初始化。valuevalue mar=new value();valuenamemar.sizemar.name

答:

3赞 Elliott Frisch 3/10/2023 #1

1 的初始化发生一次。而在那个时候,是.valuesize0

int size;

String name[]=new String[size];
float marks[]= new float[size];

这就是为什么你通常会把 放到构造函数中。如果不这样做,你可以做到size

value mar=new value();

System.out.printf("Enter size : ");
mar.size= sc.nextInt();
mar.marks = new float[mar.size];
mar.name = new String[mar.size];

或者,使用构造函数

int size;
String[] name;
float[] marks;
public value(int size) {
    this.size = size;
    this.name = new String[size];
    this.marks = new float[size];
}

然后

System.out.print("Enter size : ");
int size = sc.nextInt();
value mar = new value(size);

1 根据 Java 命名惯例,类名以大写字母开头。 应该是(或类似)。valueMyValue