2017-10-13 86 views
0

对于我的CS类,我必须编写一个从LinkedList延伸出来的Stacks接口。但是,我的peek()方法显然存在错误。当我将其实现到其他程序之一时,我返回一个IndexOutOfBounds异常(索引0;大小0),我似乎无法找到在我的peek()方法中为我处理的异常或语句。Java Stacks接口:IndexOutOfBounds

public class MyStack<anyType> extends LinkedList<anyType> { 
    private ArrayList<anyType> list; 

    public MyStack() { 
     list = new ArrayList<anyType>(10); 
    } 

    public void push(anyType x) { 
     list.add(0, x); 
    } 
    public anyType pop() { 
     if (list.get(0) == null) { 
      return null; 
     } else { 
      anyType x = list.get(0); 
      list.remove(0); 
      return x; 
     } 
    } 
    public anyType peek() { 
     if (list.get(0) == null) { 
     return null; 
     } else { 
     anyType x = list.get(0); 
      return x; 
     } 
    } 
    public boolean isEmpty() { 
     if (list.size() == 0) 
      return true; 
     else 
      return false; 
    } 
} 
+3

你的数据结构有点混乱。你扩展了'LinkedList',但是你的结构还包含一个'ArrayList',即使有人调用其他方法可以产生意想不到的结果,堆栈方法也能正常工作。这并不能帮助你的bug只是一个全面的观察。 –

+0

因为0不是空列表的有效索引,所以您无法在空列表上调用get(0)。读取您使用的类和方法的javadoc:https://docs.oracle.com/ javase/8/docs/api/java/util/List.html#get-int- –

+0

您正在尝试获取第0个元素,因为它不存在会导致索引超出范围。难道你没有其他方法来检查是否存在任何元素? –

回答

3

在检查list.get(0)== null之前,您需要检查列表是否存在于该索引处。使用:`

if(list.size() <= 0 || list.get(0) == null) 
return null 
+0

为什么你需要检查list.get(0)是否为空?不应该检查大小是否足够? [List.isEmpty()](https://docs.oracle.com/javase/7/docs/api/java/util/List.html#isEmpty())有什么问题? – eis

+0

这取决于你想要做什么,一个列表可以充满空值而不影响它的大小。 List.isEmpty()可以很好地执行相同的操作。 – tretyose

+0

是的,但为什么代码不工作,即使列表将充满空值,没有检查?无论如何,它会不会返回null,有或没有空值检查? – eis

0

我假设你只有在堆栈中没有物品时才会出现此错误。如果您的堆栈中没有任何项目,那么您的堆栈将没有索引,并调用list.get(0)将无意义。

你需要没有索引来处理一个空栈的情况:

if (list.size() == 0) return null; 

当然,这是假设“清单”本身不为空。一个更好的方法是创建一个单独的方法来检查包含空引用,空栈等等的类不变量的列表。但是为了简单赋值的目的,这就足够了。