-4

I'm doing some school exercises about implementing interfaces and I've already got the workspace and Test classes provided for me. What I have to do is basically implement the methods, run the Test Classes, and make sure they pass the tests.

Here is my code: 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;
        }

    }

}

Here are the Test Classes, in case you want to see them (provided by the school, so I doubt they're incorrect): 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());
    }

}

So when I try to run the tests, I get multiple StackOverflowErrors at queue.FifiQueue.(FifoQueue.java:10)

I've been looking through the code for some hours now but can't figure out where I've written bad code.

PS: I know some of the methods are implemented incorrectly (I will try to fix them later) but as for now I'm just trying to pass the offer() och size() methods.

james.garriss
  • 12,959
  • 7
  • 83
  • 96
  • Possible duplicate of [What is a StackOverflowError?](http://stackoverflow.com/questions/214741/what-is-a-stackoverflowerror) – PM 77-1 Jul 13 '16 at 16:24

1 Answers1

0

Your constructor is calling itself, causing infinite recursion:

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

Maybe you mean to wrap some other type of queue or list internally?

shmosel
  • 49,289
  • 6
  • 73
  • 138