java.lang.StackOverflowError异常的解决方案

975 阅读2分钟

StackOverflowError是java项目中经常出现的异常/问题之一。这种异常不应该由程序员捕获,而是由Java虚拟机在运行时抛出。

java stackoverflowerror类概述:

StackOverflowError扩展了java.lang.VirtualMachineError类,该类又扩展了java.lang.Error。那么 什么是java.lang?Error呢? Error类扩展了Throwable类,指定了应用程序无法捕捉这些异常的错误。这些异常不是编程相关的异常,而是由java虚拟机抛出的。

当方法被无限次递归调用时,在方法中抛出的StackOverflowError异常。

让我们看看下面的程序是如何抛出异常的

public class StackDemo {  
  
 public static void main(String[] args) {  
  StackDemo sd=new StackDemo();  
  sd.method();  
 }  
  
 public void hello(){  
  hello();  
 }  
}  

上述程序的输出是应用程序抛出的带有 "Exception in thread "main" java.lang.StackOverflowError"消息的异常。

下面是程序在java虚拟机的内存中执行的情况。

1.main方法是在被称为main的父线程中执行的起点,一旦执行开始,main方法在调用栈的底部有一个条目。请注意,每个线程有一个自己的调用栈。
2.之后,StackDemo对象被创建,方法hello()被主线程调用,方法区域将被存储在main()方法区域上方的调用堆栈中。 这个方法调用hello()方法无限次地递归调用同一个方法,这使得调用堆栈在内存中存储所有的方法条目。调用堆栈的大小被增加,当调用堆栈无法容纳内存中所有这些条目的大小时,异常被抛出。这里堆栈被所有条目充满,StackOverflowError 被抛出。
3.hello方法被无限次地递归调用,所以请确保避免递归的无限方法调用。

这些错误是由Java虚拟机抛出的,所以要小心方法中的递归调用。