Java 中的 StackOverflowError 示例

javaobject oriented programmingprogramming

当堆栈空间不足时,就会发生 StackOverflowError。这是一个运行时错误,表示 JVM 已耗尽资源。此类错误的主要原因可能是:循环引用、无限递归或占用更多内存的繁重应用程序。

在本文中,我们将以最简单的方式讨论上述 StackOverflowError 的原因。

Java 中的 StackOverflowError

Java 中的内存管理

在讨论 StackOverflowError 之前,了解 Java 如何为特定程序或应用程序管理内存空间非常重要。

正在运行的程序的每个接口、类、对象、变量和方法都存储在计算机内存的不同位置。引用变量、方法和类的名称存储在堆栈中,它们的值存储在堆中。

每当进程启动时,它都会自动定义一个固定的堆栈大小。每次方法调用期间,都会在调用堆栈上创建一个调用框架,并持续到方法调用结束。当计算机内存的堆栈空间中没有空间容纳新的堆栈框架时,我们就会遇到 StackOverflowError。

语法

import java.lang.StackOverflowError;

此类在"java.lang"包中可用。我们不一定需要导入此包。通常,此包的类会自动可用,而无需在我们的程序中导入它们。但是,也有一些例外。

示例 1

以下示例说明了 StackOverflowError。

import java.lang.StackOverflowError;
public class Overflw {
   public static void methodA(int n1) {
      n1++;
      methodB(n1);
   }
   public static void methodB(int n1) {
      n1++;
      methodA(n1);
   }
   public static void main(String []args) {
      int n1 = 0;
      methodA(n1);
   }
}

输出

Exception in thread "main" java.lang.StackOverflowError
	at Overflw.methodB(Overflw.java:9)
	at Overflw.methodA(Overflw.java:5)
	at Overflw.methodB(Overflw.java:9)
	at Overflw.methodA(Overflw.java:5)
	at Overflw.methodB(Overflw.java:9)
	at Overflw.methodA(Overflw.java:5)
	at Overflw.methodB(Overflw.java:9)
	at Overflw.methodA(Overflw.java:5)
	at Overflw.methodB(Overflw.java:9)
	at Overflw.methodA(Overflw.java:5)
	at Overflw.methodB(Overflw.java:9)
	at Overflw.methodA(Overflw.java:5)
	at Overflw.methodB(Overflw.java:9)
	at Overflw.methodA(Overflw.java:5)
	at Overflw.methodB(Overflw.java:9)
	at Overflw.methodA(Overflw.java:5)
	at Overflw.methodB(Overflw.java:9)

正如您在示例 1 代码的输出中看到的那样,我们得到了 StackOverflowError。我们在上面的代码中所做的是,我们创建了两个名为"methodA"和"methodB"的参数化用户定义方法。在主方法中,我们声明并将一个整数变量"n1"初始化为 0,并使用参数"n1"调用"methodA"。现在,"methodA"使用增量值"n1"调用"methodB"。同样,"methodB"调用"methodA",这个过程重复多次。因此,在某个时候,为该程序创建的堆栈大小会耗尽,从而导致以下错误。

我们可以采取以下措施来处理 StackOverflowError -

  • 仔细检查那些重复的行,并尝试找出它们未终止的原因。

  • 默认堆栈大小可能是 512KB 或 1MB,具体取决于安装的 Java 虚拟机,但我们可以手动增加堆栈大小以避免此错误。但是,这种技术很少使用。

示例 2

现在,借助此示例,我们将尝试找到前面示例中发生的 StackOverflowError 的解决方案。

public class Overflw {
   public static void methodA(int n1) {
      n1++;
      methodB(n1);
   }
   public static void methodB(int n1) {
      n1++;
      int n2 = 5;
      int mult = n1 * n2;
      System.out.println("Value of n1 and n2 multiplication is: " + mult);
   }
   public static void main(String []args) {
      int n1 = 0;
      methodA(n1);
   }
}

输出

Value of n1 and n2 multiplication is: 10

在示例 1 中,程序的问题是第 6 行和第 10 行没有终止。但在上面的例子中,我们给出了一个终止程序并打印存储在"mult"中的值的语句。

结论

StackOverflowError 发生在运行时,而不是在编译期间,这就是为什么正确处理它很重要,否则可能会给我们带来麻烦。解决这个问题最有效的方法是仔细检查发生错误的行。


相关文章