【问题标题】:Simple Java code using (implementing ArrayList as a stack) gives an error when running使用(将 ArrayList 实现为堆栈)的简单 Java 代码在运行时会出错
【发布时间】:2014-03-26 13:20:12
【问题描述】:

我终于写出了我的第一个 Java 作业。分配的重点是实现一个带有字符串的 ArrayList,它的行为应该像一个堆栈。

但是,当我在 Eclipse 中运行代码时,我得到了某种错误提示:

Exception in thread "main" øv2.Stack@c723704
java.lang.ArrayIndexOutOfBoundsException: -1
at java.util.ArrayList.elementData(Unknown Source)
at java.util.ArrayList.get(Unknown Source)
at øv2.Stack.peek(Stack.java:30)
at øv2.Stack.main(Stack.java:47)

我不知道为什么会这样,这是我的代码:

public class Stack {

    private ArrayList<String> stringList = new ArrayList<String>();

    RandomStringGenerator rsg = new RandomStringGenerator();

    private void push(String i){
        stringList.add(i);
        }

    private String Pop(){
        if (stringList.size() >= 1){
            String positionInArray = stringList.get(stringList.size() - 1);
            stringList.remove(stringList.size() - 1);
            return positionInArray;
        }

        else {
            return null;
        }

    }

    private String peek(int i){
        if (i >= 0 && i >= (stringList.size() - 1)){
            return stringList.get(stringList.size() - 1 - i);
        }
        else{
            return null;
        }
    }

    private int getSize(){
        return stringList.size();
    }

    public static void main (String [] args){
        Stack stack = new Stack();
        stack.push("1");
        stack.push("2");
        stack.push("3");
        System.out.println(stack);
        System.out.println(stack.peek(3));
        System.out.println(stack.Pop());
        System.out.println(stack);
    }

    }


import java.util.Random;

public class RandomStringGenerator {


    private int randomNumber;

    private Random randomNumberGenerator = new Random();

    public String randomStringGenerator(){
        int randomNumber = randomNumberGenerator.nextInt();
        String randomString = Integer.toString(randomNumber);
        return randomString;
    }

}

感谢您的宝贵时间!

【问题讨论】:

  • Java 对他们的错误消息非常好。您正尝试在方法peek 的第30 行访问索引位置-1。想想你在做什么,为什么会这样。
  • i &gt;= 0 &amp;&amp; i &gt;= (stringList.size() - 1) 这没有意义,你的范围检查有缺陷。
  • 你还应该检查stringList.size() &gt; 0

标签: java arraylist


【解决方案1】:

您正在调用peek(3),但peek() 中的代码访问stringList.size() - 1 - i,即-1,因此出现错误。

而且我相信你对 peek 方法的条件也是错误的if (i &gt;= 0 &amp;&amp; i &gt;= (stringList.size() - 1))。你想在这里做什么?

【讨论】:

    【解决方案2】:

    我认为这是错误所在:

    return stringList.get(stringList.size() - 1 - i);
    

    大小 = 3。 3-1-3 将变为负数。更改此部分以获得所需的输出! :)

    【讨论】:

    • 非常感谢!我改变了它,现在它可以工作了,但我能问你一些事情吗?我认为当我将数组打印到屏幕上时,它会打印字符串“1”、“2”和“3”,因为这些是 attay 中的字符串,但是它会打印到屏幕上“øv2.stack@3dccbdf7” ,你知道这是为什么吗?
    • 没问题。如果有帮助,请接受它作为您问题的答案! :)
    • @user3257736:你试过toString吗?
    • 直接打印arrayList会打印它的对象格式。您可以通过调用堆栈对象上的 toString() 来打印数组值,就像 staticx 建议的那样。您还可以通过在您的类中定义一个 toString() 方法来定义您希望如何打印堆栈!希望能解释清楚。
    【解决方案3】:

    peek 方法应该有以下返回:return stringList.get(stringList.size() - i); 当您创建 peek(3) 时它失败了,因为您知道 ArrayList 只有 3 个值,并且通过在 i 之外减去 1,您试图访问位置上的元素-1

    【讨论】:

      【解决方案4】:

      您的问题在于 peek()。我认为您希望它检查 i (stringList.size() - 1)。

      if (i >= 0 && i <= (stringList.size() - 1)){ return stringList.get(stringList.size() - 1 - i); }

      【讨论】:

        【解决方案5】:

        你的if() 条件真的很奇怪,我想你想把if (i &gt;= 0 &amp;&amp; i &lt;= (stringList.size() - 1)) 放进去

        【讨论】:

        • 这样可以避免越界错误:stringList.get(stringList.size() - 1 - i);
        猜你喜欢
        • 2015-08-02
        • 2021-07-19
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2021-08-24
        • 1970-01-01
        • 2021-12-03
        • 1970-01-01
        相关资源
        最近更新 更多