Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Why am I getting a StackOverflowError exception in my constructor

public class Cloning {

    Cloning c=new Cloning();
    public static void main(String[] args) {

        Cloning c=new Cloning();
        c.print();
    }

    public void print(){
        System.out.println("I am in print");
    }

}

In the above code I have a simple class and a class level instance, I also have a local instance with the same name. When running the above code I get below exception :

Exception in thread "main" java.lang.StackOverflowError
    at com.java8.Cloning.<init>(Cloning.java:6)
like image 965
Nitish Singla Avatar asked Mar 07 '16 13:03

Nitish Singla


People also ask

How do I stop StackOverflowError in Java?

Increase Thread Stack Size (-Xss) Increasing the stack size can be useful, for example, when the program involves calling a large number of methods or using lots of local variables. This will set the thread's stack size to 4 mb which should prevent the JVM from throwing a java.

Why am I getting a stack overflow error?

The most-common cause of stack overflow is excessively deep or infinite recursion, in which a function calls itself so many times that the space needed to store the variables and information associated with each call is more than can fit on the stack.

Can stackoverflow error be caught?

StackOverflowError is an error which Java doesn't allow to catch, for instance, stack running out of space, as it's one of the most common runtime errors one can encounter.


3 Answers

Your main method creates a Cloning instance (Cloning c=new Cloning();), which causes the initialization of the instance variable c (Cloning c=new Cloning();), which creates another Cloning instance, and so on...

You have an infinite chain of constructor calls, which leads to StackOverflowError.

In the above code I have a simple class and a class level instance

You don't have a class level instance. You have an instance level instance. If you want a class level instance, change

Cloning c=new Cloning();

to

static Cloning c=new Cloning();
like image 125
Eran Avatar answered Oct 11 '22 17:10

Eran


You instantiate the class Cloning every time Cloning is constructed, which causes a recursion on instantiations.

like image 45
Robert Bräutigam Avatar answered Oct 11 '22 17:10

Robert Bräutigam


Didn't you mean to write static Cloning c = new Cloning(); outside main, or c = new Cloning(); within main instead?

Otherwise, you'll get a new instance of c each time this is run, which will cause a StackOverflowError.

Currently the creation of the local c in Cloning c = new Cloning(); (which shadows the field c) kicks the whole thing off.

like image 44
Bathsheba Avatar answered Oct 11 '22 16:10

Bathsheba