为什么我会收到这个 IndexOutOfBoundsException 错误?

时间:2021-03-29 04:41:24

标签: java

嗨,我目前正在尝试解决我代码中的这个错误,如果有人能解释我哪里出错了,我将不胜感激。


public class Lab07vst100SD
{
   public static void main (String[] args)
   {
     
      System.out.println();
      int size = 10;
      School bhs = new School(size);
      System.out.println(bhs);
      System.out.println(bhs.linearSearch("Meg"));
      System.out.println(bhs.linearSearch("Sid"));
      System.out.println();
      bhs.selectionSort();
      System.out.println(bhs);
      System.out.println(bhs.binarySearch("Meg"));
      System.out.println(bhs.binarySearch("Sid"));
      System.out.println();
   }     
}

class School
{
   private ArrayList<Student> students;
   private int size;
   
   public School (int s) 
   {
      students = new ArrayList<Student>();
      size = s;
   }
   public void addData() 

   { 
      String [] name = {"Tom","Ann","Bob","Jan","Joe","Sue","Jay","Meg","Art","Deb"};
      int[] age = {21,34,18,45,27,19,30,38,40,35};
      double[] gpa = {1.685,3.875,2.5,4.0,2.975,3.225,3.65,2.0,3.999,2.125};
     
       
      for(int i = 0; i < name.length; i++)
      {
         students.add(new Student(name[i], age[i], gpa[i]));  
      }
      size = students.size(); 
   } 
 
   
   public void selectionSort () 

   {
      for(int h = 0; h < students.size(); h++)
      {
         int index = h;
         Student least = students.get(h);
         for (int t = 0; t < size; t++) {
            if (students.get(t).equals(least)) {
               least = students.get(t);
               index = t;
            }
            Student temp = students.get(h);
            students.set(h, least);
            students.set(t, temp);
         }
      }
       
   }

   public int linearSearch (String str)
   { 
   // new arraylist 
      ArrayList<String> names = new ArrayList<String>();
      for (int q = 0; q < size; q++) {
         names.add(students.get(q).getName());
      }
      //comparison 
      for (int y = 0; y < size; y++) {
         if (names.get(y).equals(str))
            return y;
      }
      return -1;
   };    
   public int binarySearch (String str) {
   // new arraylist and variables
      ArrayList<String> names = new ArrayList<String>();
      Boolean found = false;
      int lo = 0;
      int hi = size;
      int mid = (lo + hi) / 2;
      //for loop for to transverse the array.
      for (int m = 0; m < size; m++) {
         names.add(students.get(m).getName());
      }
      while (lo <= hi && !found) {
         if (names.get(mid).compareTo(str) == 0)
         {
            found = true;
            return mid;
         }
         if (names.get(mid).compareTo(str) < 0) {
            lo = mid + 1;
            mid = (lo + hi) / 2;
         }
         else {
            hi = mid -1;
            mid = (lo + hi) / 2;
         }
      }
      if (found)
         return mid;
      else
         return -1;  
   }
   public String toString() { 
      String temp = "";
      for (int s = 0; s < students.size(); s++) {
         temp += students.get(s);
      }
      return temp; 
   }
}

另外,我应该提到这使用了学生类。

这里

public class Student
{
   private String name;
   private int age;
   private double gpa;
   
   public Student (String n, int a, double g)
   {
      name = n;
      age = a;
      gpa = g;
   }
   
   public String getName() { 
      return name; }  
   public int getAge()     { 
      return age; }  
   public double getGPA()  { 
      return gpa; }
      
   public String toString()
   {
      String temp = name + "  " + age + "  " + gpa + "\n";
      return temp;
   }
}

学校班级呼叫学生班级。

这就是回来的东西。

Exception in thread "main" java.lang.IndexOutOfBoundsException: Index 0 out of bounds for length 0
    at java.base/jdk.internal.util.Preconditions.outOfBounds(Preconditions.java:64)
    at java.base/jdk.internal.util.Preconditions.outOfBoundsCheckIndex(Preconditions.java:70)
    at java.base/jdk.internal.util.Preconditions.checkIndex(Preconditions.java:248)
    at java.base/java.util.Objects.checkIndex(Objects.java:359)
    at java.base/java.util.ArrayList.get(ArrayList.java:427)
    at School.linearSearch(Lab07vst100SD.java:78)
    at Lab07vst100SD.main(Lab07vst100SD.java:16)

我完全不明白为什么会发生这种情况,我认为这可能与 ArrayList 有关,除此之外,我不确定。 请帮忙,谢谢

附言我是新手,所以请忍受我可怕的格式。

2 个答案:

答案 0 :(得分:2)

您需要致电 addData

public static void main (String[] args)
    {

        System.out.println();
        int size = 10;
        School bhs = new School(size);
        bhs.addData(); // here 
        System.out.println(bhs);
        System.out.println(bhs.linearSearch("Meg"));
        System.out.println(bhs.linearSearch("Sid"));
        System.out.println();
        bhs.selectionSort();
        System.out.println(bhs);
        System.out.println(bhs.binarySearch("Meg"));
        System.out.println(bhs.binarySearch("Sid"));
        System.out.println();
    }

答案 1 :(得分:-1)

...
class School
{
   private ArrayList<Student> students;
   private int size;
   
   public School (int s) 
   {
      students = new ArrayList<Student>(); // Here, it can throw IndexOutOfBoundsException 
      size = s;
   }
...

请参阅https://www.tutorialspoint.com/java/util/arraylist_add_index.htm

ArrayList 的容量必须在 ArrayList.add 方法之前初始化 .