【问题标题】:Why am I getting index out of bounds exception?为什么我的索引越界异常?
【发布时间】:2018-06-27 00:11:15
【问题描述】:

我已经编写了这段代码来将整个以 10 为底的数字转换为二进制。我相信代码就是它需要的一切,但我无法让ArrayList 工作。

我已经在这个网站上花费了几个小时,并且尝试了无数次更改都无济于事。

我已经得到了可以正确编译的代码,但是一旦我运行它并输入int,程序就会崩溃。

代码如下:

import java.util.Scanner;
import java.util.ArrayList;

public class BinaryConverter {
   public static void main(String[] args) {
      Scanner in = new Scanner(System.in);
      ArrayList<Integer> binary = new ArrayList<Integer>();
      int a = in.nextInt();
      binary = binaryConverter(a);
      for (int i = binary.size(); i > -1; i = i - 1){
         System.out.print(binary.get(i));
      }
  }
  public static ArrayList<Integer> binaryConverter(Integer n) {
   ArrayList<Integer> remainder = new ArrayList<Integer>();
   while (n/2 != 0) {
      remainder.add(n%2);
      n = n/2;
   }
   remainder.add(n%2);
   return remainder;
  }
}

这些是我输入数字时 java 向我抛出的异常。

Jons-iMac:java jon$ java BinaryConverter
142

Exception in thread "main" java.lang.IndexOutOfBoundsException: Index 8 out-of-bounds for length 8
    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:372)
    at java.base/java.util.ArrayList.get(ArrayList.java:440)
    at BinaryConverter.main(BinaryConverter.java:16)

我希望这是足够的信息。

【问题讨论】:

  • 不要从binary.size()开始。从binary.size() - 1开始。
  • @Jon - 顺便说一句,我想指出ArrayList 是在实施过程中做出的选择;您正在处理一个 List,它恰好是一个 ArrayList。好的做法是声明 List&lt;Integer&gt; binary = new ArrayList&lt;&gt;();我有一个列表,我选择了一个 ArrayList 来实现。(也使用 diamond operator 来消除多余的 Integer 声明)
  • @StephenP 另见this 答案。
  • 当我使用 List 而不是 ArrayList 时,我在编译时收到“找不到符号”错误。使用文本编辑器和 cmd 而不是 ide 对我来说会死吗?
  • @Jon 一个已经过时的文本编辑器。如果您使用 IJ,您是否尝试过 this 解决方案。

标签: java arraylist indexoutofboundsexception


【解决方案1】:

在您的代码中,您 get 按索引计算的值不正确。

  for (int i = binary.size(); i > -1; i = i - 1){
     System.out.print(binary.get(i));
  }

binary.size() 的赋值确实超出了范围,因为索引从 binary.size() 计数到零,但它超出了从零到 binary.size()-1 的范围。

【讨论】:

    【解决方案2】:
    for (int i = binary.size(); i > -1; i = i - 1){
    

    假设binary包含8个元素,i首先以8开头。但是Java中的列表/数组等是从0开始的,所以索引应该是0-7。当然,当你尝试访问binary.get(8)时它会给你错误

    【讨论】:

    • 这是我应该知道的事情......那是一个巨大的大脑放屁。感谢阿德里安的帮助!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-11-19
    • 2013-03-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-01-31
    相关资源
    最近更新 更多