家庭作业StackoverflowError

时间:2016-07-13 16:21:31

标签: java stack-overflow

我正在做一些关于实现接口的学校练习,而且我已经为我提供了工作空间和测试课程。我要做的是基本上实现方法,运行测试类,并确保它们通过测试。

这是我的代码:http://pastebin.com/e8Vh3snC

package queue;
import java.util.*;

public class FifoQueue<E> extends AbstractQueue<E> implements Queue<E> {
    private QueueNode<E> last;
    private int size=0;
    private FifoQueue<E> queue;

    public FifoQueue() {
        queue = new FifoQueue<E>();
    }

    /**
     * Returns an iterator over the elements in this queue
     * @return an iterator over the elements in this queue
     */
    public Iterator<E> iterator() {
        return queue.iterator();
    }

    /**
     * Returns the number of elements in this queue
     * @return the number of elements in this queue
     */
    public int size() {    
        return size;
    }

    /**
     * Inserts the specified element into this queue, if possible
     * post:    The specified element is added to the rear of this queue
     * @param   x the element to insert
     * @return  true if it was possible to add the element
     *          to this queue, else false
     */
    public boolean offer(E x) {
        if(queue.add(x)){
        size++;
        return true;
        } else  {
            return false;
        }
    }

    /**
     * Retrieves and removes the head of this queue,
     * or null if this queue is empty.
     * post:    the head of the queue is removed if it was not empty
     * @return  the head of this queue, or null if the queue is empty
     */
    public E poll() {
        if(queue.size() > 0) {
            size=size-1;
        }
        return queue.poll();
    }

    /**
     * Retrieves, but does not remove, the head of this queue,
     * returning null if this queue is empty
     * @return  the head element of this queue, or null
     *          if this queue is empty
     */
    public E peek() {
        return queue.peek();
    }


    private static class QueueNode<E> {
        E element;
        QueueNode<E> next;

        private QueueNode(E x) {
            element = x;
            next = null;
        }

    }

}

以下是测试课程,如果你想看到它们(由学校提供,所以我怀疑它们是不正确的):http://pastebin.com/uV46j0rm

package testqueue;

import static org.junit.Assert.*;
import org.junit.After;
import org.junit.Before;
import org.junit.Test;

import java.util.NoSuchElementException;
import java.util.Iterator;

import queue.FifoQueue;

public class TestFifoQueue {
    private FifoQueue<Integer> myIntQueue;
    private FifoQueue<String> myStringQueue;

    @Before
    public void setUp() throws Exception {
        myIntQueue = new FifoQueue<Integer>();
        myStringQueue = new FifoQueue<String>();
    }

    @After
    public void tearDown() throws Exception {
        myIntQueue = null;
        myStringQueue = null;
    }

    /**
     * Test if a newly created queue is empty.
     */
    @Test
    public final void testNewFifoQueue() {
        assertTrue(myIntQueue.isEmpty());
        assertTrue(myIntQueue.size() == 0);
    }

    /** Test a single offer followed by a single peek. */
    @Test
    public final void testPeek() {
        myIntQueue.offer(1);
        int i = myIntQueue.peek();
        assertEquals("peek on queue of size 1", 1, i);
        assertTrue(myIntQueue.size() == 1);
    }

    /**
     * Test a single offer followed by a single poll.
     */
    @Test
    public final void testPoll() {
        myIntQueue.offer(1);
        int i = myIntQueue.poll();
        assertEquals("poll on queue of size 1", 1, i);
        assertTrue("Wrong size after poll", myIntQueue.size() == 0);
    }

    /**
     * Test peek of empty queue.
     */
    @Test
    public final void testPeekOfEmpty() {
        assertEquals("Front of empty queue not null", null, myIntQueue.peek());
    }

    /**
     * Test poll of empty queue.
     */
    @Test
    public final void testPollOfEmpty() {
        assertEquals("Poll of empty queue should return null", null, myIntQueue
                .poll());
    }

    /**
     * Test that implementation works for a queue of strings.
     */
    @Test
    public final void testStringQueue() {
        myStringQueue.offer("First");
        myStringQueue.offer("Second");
        myStringQueue.offer("Third");
        assertTrue("Wrong size of queue", myStringQueue.size() == 3);
        assertEquals("peek on queue of strings", "First", myStringQueue.peek());
        assertEquals("String First expected", "First", myStringQueue.poll());
        assertEquals("String Second expected", "Second", myStringQueue.poll());
        assertEquals("String Third expected", "Third", myStringQueue.poll());
        assertTrue("Queue of strings should be empty", myStringQueue.isEmpty());
    }

    /**
     * Test that polling gives elements in right order.
     */
    @Test
    public final void testOrder() {
        myIntQueue.offer(1);
        myIntQueue.offer(2);
        myIntQueue.offer(3);
        myIntQueue.offer(4);
        myIntQueue.offer(5);
        for (int i = 1; i <= 5; i++) {
            int k = myIntQueue.poll();
            assertEquals("poll returns incorrect element", i, k);
        }
        assertTrue("Queue not empty", myIntQueue.isEmpty());
    }

    /**
     * Test that polling all elements gives an empty queue.
     */
    @Test
    public final void testMakeQueueEmpty() {
        myIntQueue.offer(1);
        myIntQueue.offer(2);
        myIntQueue.poll();
        myIntQueue.poll();
        assertTrue("Wrong size after poll", myIntQueue.size() == 0);
        assertTrue("Queue not empty after poll", myIntQueue.isEmpty());
        myIntQueue.offer(3);
        myIntQueue.offer(4);
        assertTrue("Wrong size after offer", myIntQueue.size() == 2);
        for (int i = 3; i <= 4; i++) {
            int k = myIntQueue.poll();
            assertEquals("poll returns incorrect element", i, k);
        }
        assertTrue("Wrong size after poll", myIntQueue.size() == 0);
        assertTrue("Queue not empty after poll", myIntQueue.isEmpty());
    }

}

所以当我尝试运行测试时,我在queue.FifiQueue上得到多个StackOverflowErrors。(FifoQueue.java:10)

我现在已经查看了几个小时的代码,但无法弄清楚我写错了代码的位置。

PS:我知道有些方法实现不正确(我稍后会尝试修复它们)但是现在我只是试图传递offer()och size()方法。

1 个答案:

答案 0 :(得分:0)

你的构造函数正在调用自身,导致无限递归:

public FifoQueue() {
    queue = new FifoQueue<E>();
}

也许你的意思是在内部包装其他类型的队列或列表?