-1

Im trying to work on some of the Queue methods, get some practice with them in a little bit so I chose a handful from the list on Oracle's documentation and gave them a shot. Everything in my code seems to be working smoothly except for this one hiccup that I have not been able to get over. I'm pretty new at programming and I am in college for it, but I am still learning the basics. Here is what I have for my code:

import java.util.NoSuchElementException;
public class Queue<E> {

        private Object[] queue;
        private int size = 0;
        private int top;
        private int bottom;
        
        public Queue() {
            queue = new Object[10];
        }
        

        public Queue(int capacity) {
            queue = new Object[capacity];
            
        }
        
        @SuppressWarnings("unchecked")
        public E elm() {
            if (size == 0) {
                throw new NoSuchElementException();
            }
            return (E) queue[top];
            
    
        }
        
        public boolean add(E elm) {
            if (elm == null) {
                throw new NullPointerException();
            }
            if (size == queue.length) {
                    int newCapacity = (int)Math.ceil(queue.length + 1.5);
                    Object[] newArr = new Object[newCapacity];
                    for (int i = 0; i < queue.length; i++) {
                        newArr[i] = queue[i];
                    }
            }
            if (bottom == -1) {
                top = 0;
                bottom = 0;
                queue[bottom]= elm;
            } else {
                bottom = (bottom +1) % queue.length;
            }
            queue[bottom] = elm;
            size++;
            return true;
        }

        public boolean isEmpty() {
            return size == 0;
        }
        
        @SuppressWarnings("unchecked")
        public E remove() {
            if (size == queue.length) {
                throw new NoSuchElementException();
            }
            E elm = (E) queue[top];
            top = (top +1) % queue.length;
            size--;
            
            if (size == 0) {
                bottom = -1;    
            }
            return elm;
        }
        
        public void clear() {
            return;
        }
        
        public int size() {
            for (int i = 0; i < queue.length; i++) {
                size += 1;
            }
            return size;
        }

        boolean contains(Object o) {
            if (Queue.contains(o)) {
            return true;
            } else {
            return false;
            }
        }

}//end of file 

the problem lies in the very last block of code. I keep getting the message in Eclipse, telling me "Cannot make a static reference to the non-static method contains(Object) from the type Queue" and it is suggesting I change contains() to static. I have tried this to no avail. When I do change it to static, I only get a repeating error upon running it that says "Exception in thread "main" java.lang.StackOverflowError" and gives the location of the error repeatedly. I am not sure what it is that I am doing wrong here? I'll put my driver below; I was using it to test some of my code but it doesnt have a whole lot in it.


public class Driver {

    public static void main(String[] args) {
        Queue<Integer> a1 = new Queue<>();
        
        a1.add(10);
        a1.add(79);
        
        System.out.println(a1.size());
        
        System.out.println(a1.contains(10));
        
        
        
        
        
    }

}
Mikayla
  • 11
  • 2
  • You are not getting a 'cannot access static function' error. You are getting a 'cannot access *non*-static *method*' error, which is exactly the opposite. Details matter. You have a design problem here. Why are you trying to call the `contains()` method from within itself? – user207421 Oct 27 '20 at 23:08

1 Answers1

1

Queue.contains is notation of calling a static method of the Queue class, which is why it is complaining.

On changing it to static, you are then just making the contains functions call itself recursively forever which is why it then stack overflows.

You will need to write the code yourself to compare each element for the contains function.

lostbard
  • 5,065
  • 1
  • 15
  • 17