Stack Overflow in Java
A stack is the part of the memory. The local automatic variable is created on this stack and method arguments are passed. When a process starts, it get a default stack size which is fixed for each process. In today's operating system, generally, the default stack size is 1 Mb, which is enough for most of the process. Under abnormal condition, the stack limit exceeds. This is known as stack overflow.
The two most common reason for stack overflow are given below :
- infinite recursion
- allocating size greater than stack's limit
1. Infinite Recursion
The most common reason of stack overflow is Infinite Recursion. The infinite loop of recursion going on due to which stack's limit exceeds.
For example, take a look at given below code:
int f(){ g(); } int g() { f(); }
f() is calling g() and g() is calling f(). Due to this loop goes on infinitely. This cause stack overflow.
Catching the stack overflow
You can put the suspicious code under the try block and can catch the StackOverflowError exception. Given below code will give you clear idea how can you do this :
public class Example { public static void endless() { endless(); } public static void main(String args[]) { try { endless(); } catch(StackOverflowError t) { // more general: catch(Error t) // anything: catch(Throwable t) System.out.println("Caught "+t); t.printStackTrace(); } System.out.println("After the error..."); } }
2. Allocating size greater than stack's limit
The second common reason for causing stack overflow is allocating size greater than stack's limit. For example in the given below example, the array size allocation exceeds the limit which cause the stack overflow :
int test() { int x[10000000]; // array is too large int y =0; //y's address exceeds the stack's limits, error }