【问题标题】:I have an ArrayList with 14 values, but get IndexOutOfBounds Exception. I checked if they were null and they printed the values我有一个包含 14 个值的 ArrayList,但得到 IndexOutOfBounds 异常。我检查了它们是否为空并打印了值
【发布时间】:2017-08-03 17:17:03
【问题描述】:
int index=0;
ArrayList<Integer> list = new ArrayList<>(14);


for (index = text.indexOf("$");
  index >= 0;
  index = text.indexOf("$", index + 1))

  {
     list.add(index);   
  }

  System.out.print(list.size());


System.out.println(text.substring(list.get(12)+1,list.get(12)+8));    
System.out.println(text.substring(list.get(13)+1, list.get(13)+8));

System.out.println(text.substring(list.get(14)+1,list.get(14)+9));
System.out.println(text.substring(list.get(14)-10, list.get(14)+9));                            

String a7 = text.substring(list.get(7)+1,list.get(7)+8);
String a8 = text.substring(list.get(8)+1,list.get(8)+8);
String a9 = text.substring(list.get(9)+1,list.get(9)+8);
String a10 = text.substring(list.get(10)+1,list.get(10)+8);
String a11 = text.substring(list.get(11)+1,list.get(11)+7);
String a12 = text.substring(list.get(12)+1,list.get(12)+8);    
String a13 = text.substring(list.get(13)+1, list.get(13)+8);
String a14 = text.substring(list.get(14)+1,list.get(14)+9);
String a15 = text.substring(list.get(14)-10, list.get(14)+9);

错误:

线程“主”java.lang.IndexOutOfBoundsException 中的异常:索引: 12、大小:12 在 java.util.ArrayList.rangeCheck(ArrayList.java:653)
在 java.util.ArrayList.get(ArrayList.java:429) 在 pkgfinal.Final.main(Final.java:240)

我确保索引 12 有一个值,但我仍然收到此错误。 “文本”是扫描文档

编辑: 您选择打开此文件:Scan.pdf /C:/Users/sahaj/Documents/NetBeansProjects/Final/build/classes/

  1. 99

981.83

  1. 13

3279 美元。 13

线程“主”java.lang.IndexOutOfBoundsException 中的异常:索引:12,大小: 12

at java.util.ArrayList.rangeCheck(ArrayList.java:653)

at java.util.ArrayList.get(ArrayList.java:429)

at pkgfinal.Final.main(Final.java:245)

453

【问题讨论】:

  • “文本”的内容是什么?
  • 你如何确保“那个索引 12 有一个值”?
  • 文本是已扫描的收据。它被告知要获取美元符号的所有实例。我已经通过将它打印到控制台来检查它是否有价值。它给出了一个值,但也给出了一个错误
  • 不清楚目标是什么。目标是找出美元后面的所有美元金额吗?
  • @Lii 抱歉我今天才注册。

标签: java arraylist indexoutofboundsexception


【解决方案1】:
Exception in thread "main" java.lang.IndexOutOfBoundsException: Index: 12, Size: 12

所以你的 list 包含 12 个元素,你不能使用方法 list.get(12); 因为 java.util.List 是零可索引的,你应该使用 list.get(11); 来获取第 12 个元素。

【讨论】:

  • 但是我可以访问索引 12 的值以及较大的值。
  • 您确定“文本”至少包含 12 个“$”字符吗?
  • 是的,我数了15个,程序都识别了。
【解决方案2】:

您的 ArrayList 不包含 14 个值。

新建ArrayList时,其构造函数接受的Integer为初始容量,并不表示该数组包含14个空值。

初始容量的ArrayList 包含一个包含14 个空槽的Objects 数组,但它的“size”字段设置为0,因为您没有向ArrayList 添加任何元素。

当您调用 get 方法时,它会检查索引是否

【讨论】:

  • @SahajPatel 您是否在检查它们是否为非空。您已经创建了一个初始大小填充有空值的 ArrayList。
  • 不,我只是 System.out.println 他们持有的价值,它工作正常,但只得到阻碍进度的错误
  • 您能告诉我们您如何打印该值吗?您是否使用一些内置方法或遍历 ArrayList 和 .get() 值?
  • @MikulskiBartosz 老实说,我看不出哪里出了问题。数组中存储了 14 个值,但告诉我们只有 12 个。
  • System.out.println(text.substring(list.get(12)+1,list.get(12)+8)); ^^^这就是我检查的方式。它只是打印它们,而不是将它们保存在字符串中
【解决方案3】:

在不知道输入数据的确切格式的情况下,这就是我想出的。了解更多有关数据的信息,您可以简化此逻辑。

String text = "This is a receipt $12.10 and $14.50";

ArrayList<BigDecimal> dollarAmounts = new ArrayList<>();
int index = 0;
while ((index = text.indexOf("$", index)) != -1) {
  int whitespace = text.indexOf(" ", index + 1);
  if (whitespace == -1) {
    dollarAmounts.add(new BigDecimal(text.substring(index + 1)));
  } else {
    dollarAmounts.add(new BigDecimal(text.substring(index + 1, whitespace)));
  }
  index++;
}

for (BigDecimal dollarAmount : dollarAmounts) {
  System.out.println(dollarAmount);
}

您的原始示例对 ArrayList 的工作方式做出了一些不正确的假设。

当您创建 ArrayList(14) 时,您将支持数组大小设置为 14。ArrayListObject[] 支持,当该数组填满时,它需要创建一个更大的支持数组并复制所有元素从原来的进去。

这很慢。

如果您知道您将使用 200 万个对象填充一个数组,那么最好在接近该容量的情况下启动它以减少内部复制操作。

【讨论】:

  • 你觉得用数组代替数组列表会更好吗?
  • 由于收据数据的长度通常会随着购买的商品越多而发生变化,我会说不,您将不得不复制 ArrayList 已经提供的大量工作。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-01-06
  • 1970-01-01
  • 1970-01-01
  • 2012-09-09
  • 1970-01-01
相关资源
最近更新 更多