【问题标题】:Error with/using ArrayList使用/使用 ArrayList 时出错
【发布时间】:2014-11-05 17:48:11
【问题描述】:

我们正在从一个文件中创建一个ArrayList,其中包含整数(里程表读数)和双精度数(每次加注的加仑数)。我们正在使用它们来增加里程。然后我们使用容器类来访问它们,依此类推。

容器如下所示:

package lab08;

public class FillUp{
   private final int odometer;
   private final double gallons;


  public FillUp(int givenOdometer, double givenGallons){
  odometer = givenOdometer;
  gallons = givenGallons;
  }

public int getOdometer(){
return odometer;
}

 public double getGallons(){
 return gallons;
 }

}

我的代码如下所示:

public class MileageCalculator {    

    public static void main(String[] args) throws FileNotFoundException{
        Scanner scan = new Scanner(new File("/Users/Mobile_Hive/Desktop/Homework/mileage.txt"));
            double mileage=0.0;
            int i=0;
            System.out.println(fillUpArray(scan).get(0));
            /**
            while(i+1<fillUpArray(scan).size()){
                mileage=(((FillUp)fillUpArray(scan).get(i+1)).getOdometer()-((FillUp) fillUpArray(scan).get(i)).getOdometer())/((FillUp) fillUpArray(scan).get(i+1)).getGallons();
                System.out.println("Mileage: "+mileage);
                i++;
            }
           **/ 
        }
    private static ArrayList<FillUp> fillUpArray(Scanner scan){
        ArrayList<FillUp> list = new ArrayList<FillUp>();
        int odometer=0;
        double gallons=0.0;
        while(scan.hasNextLine()){
        String line = scan.nextLine();
        Scanner scans = new Scanner(line);
        while(scans.hasNext()){
            odometer=scans.nextInt();
            gallons=scans.nextDouble();
        }
        FillUp fill = new FillUp(odometer, gallons);
        list.add(fill);
        }
        return list;
    }

我正在使用 cmets 来屏蔽我的方法来获取实际里程计算并尝试查看我是否可以访问我尝试创建的 ArrayList 的索引...... 当我以当前形式运行它时,我得到:

lab08.FillUp@3bbf502d

当我删除导致“i++”的“while(i+1

Exception in thread "main" java.lang.IndexOutOfBoundsException: Index: 1, Size: 0
at java.util.ArrayList.rangeCheck(ArrayList.java:635)
at java.util.ArrayList.get(ArrayList.java:411)
at lab08.MileageCalculator.main(MileageCalculator.java:15)

我觉得在第一种情况下,我没有访问数组列表的索引,几乎就像它没有被填充一样。在第二次尝试中,我不太确定发生了什么。 我不是在寻找直截了当的答案,而只是用非常精简的指令来解释正在发生的事情。我也很想了解正在发生的事情,所以如果有人能把我推到一些很棒的阅读材料上。

【问题讨论】:

  • 在 FillUp 类中覆盖 toString。
  • 是的,您正在打印列表的第一个元素,即FillUp。但是您没有在FillUp 类中覆盖toString(),这就是为什么您会得到这样的输出...对于您的循环,获取ArrayList once 而不是调用@ 987654330@ 在您的循环中。

标签: java arraylist


【解决方案1】:

您每次调用fillUpArray(scan) 时都会得到一个不同的ArrayList,其大小可能与您在之前调用该方法时得到的完全不同。您应该调用该方法一次并将其输出存储在一个变量中,以便您使用相同的列表。

        List list = fillUpArray(scan);
        System.out.println(list.get(0));
        while(i+1<list.size()){
            mileage=(((FillUp)list.get(i+1)).getOdometer()-((FillUp) list.get(i)).getOdometer())/((FillUp) list.get(i+1)).getGallons();
            System.out.println("Mileage: "+mileage);
            i++;
        }

【讨论】:

  • 试一试,得到这个错误....再一次,我觉得 List 没有正确填充或填充....线程“main”中的异常 java.lang.IndexOutOfBoundsException: Index : 0, Size: 0 at java.util.ArrayList.rangeCheck(ArrayList.java:635) at java.util.ArrayList.get(ArrayList.java:411) at lab08.MileageCalculator.main(MileageCalculator.java:17) 还有,使用 SOP 打印出来的结果和以前一样,lab08.FillUp@1647ad40 我觉得我需要添加一个 toString....
  • @Loomiss 在循环内还有另一个对 fillUpArray 的调用,我忘记替换了。如果您也没有更换它,它可能会解释错误。查看我的编辑。
  • 非常感谢,现在可以使用了。我知道发生了什么(就像所有命令等)我只是无法弄清楚错误背后的细节,这让我感到沮丧。我也在有限的时间线上(整个星期都在重新认证我的医疗军队执照......)你能指出我阅读 ArrayList/Arrays 的好/深入的文章/来源,以确保我对这些东西有很好的基础知识吗?
猜你喜欢
  • 1970-01-01
  • 2017-01-13
  • 1970-01-01
  • 1970-01-01
  • 2023-03-11
  • 2021-08-09
  • 1970-01-01
  • 2021-07-19
  • 2016-01-21
相关资源
最近更新 更多