Class A{
A a=new A();
}
为什么会造成 java.lang.StackOverflowError 溢出 ?
我想这样的代码对于一个JAVA 程序员通常是不会写的, 但有人就是写了,没办法,而且一定要问起哦个为什么啊! 开始的时候我是想这为什么会出问题啊, 我开始从Java 的 Init 慢慢想起,也没感觉会出这样的问题,但我一想为什么不反编译一下这个代码啊,这不用了DJ反编译, 反编译出来的代码如下:
Class A{
public A(){
a= new A();
}
}
你说这能不造成java.lang.StackOverflowError嘛,所以写代码我们要避免写这样的代码,应该将其放入到 方法体中(自己的Constructer除外) 或者是放入到 Static 中,以上的代码用JVM的指令,其实如下:
Code:
0: aload_0
1: invokespecial #1; //Method java/lang/object .<init>
4: aload_0
5: new #2; //class A
8: dup
9: invokespecial #3; //Method java/lang/object .<init>
12: putfield #4; //Field a:LA;
15: return
在这里 constructer 中是调用 init , 而 static 是调用 cinit , 固我们如果将自己的对象放入到 static 中是不会造成递归, 而如果将自己本身放到 constructer 中他就会不断的调用 init , 所以才发生了上面的java.lang.StackOverflowError 溢出错误.
分享到:
相关推荐
在Java编程中,`java.lang.StackOverflowError` 是一个常见的运行时异常,它通常发生在程序执行过程中,当Java虚拟机(JVM)的调用栈溢出时。调用栈是每个线程用来存储方法调用信息的数据结构,当递归调用过深或者...
tomcat内存溢出解决办法,错误信息:java.lang.OutOfMemoryError:PermGen space 参考该文档可快速解决内存溢出的问题,服务器:tomcat
常见的问题
java.lang.StackOverflowError 是一种堆栈溢出错误,指的是在程序中递归调用的层次太深而导致堆栈溢出时抛出的异常。 29. java.lang.ThreadDeath 线程结束 java.lang.ThreadDeath 是一种线程结束,指的是在程序中...
2. **`java.lang.StackOverflowError`** - 当程序递归过深导致栈溢出时抛出此错误。 3. **`java.lang.OutOfMemoryError`** - 当JVM无法分配更多内存时抛出此错误。 4. **`java.lang.InternalError`** - 表示JVM内部...
- **`java.lang.StackOverflowError`**:当栈溢出时抛出,通常由无限递归引起。 - **`java.lang.UnsupportedClassVersionError`**:当JVM版本不支持类文件版本时抛出。 - **`java.lang.VirtualMachineError`**:当...
2. **java.lang.StackOverflowError**: 当递归调用过深导致堆栈溢出时,会抛出这个错误。这通常意味着一个函数或方法在调用自身时没有正确的退出条件。优化递归结构或提高JVM的堆栈大小可以避免这个问题。 3. **...
java.lang.StackOverflowError java.lang.Exception java.io.IOException java.sql.SQLException java.sql.SQLSyntaxErrorException java.lang.RuntimeException java.lang.NullPointerException java.lang....
常见的内存错误包括`java.lang.OutOfMemoryError: Heap space`(堆空间不足)、`java.lang.OutOfMemoryError: PermGen space`(方法区空间不足)和`java.lang.StackOverflowError`(栈溢出)。这些错误通常由于物理...
- 错误信息:编译器报错提示无法初始化pagecontext,异常为java.lang.StackOverflowError。 - 原因分析:在接口Rollable中定义的成员变量ball的引用被改变了,但接口中的成员变量默认是public static final的,即...
- **`java.lang.StackOverflowError`**:栈溢出时抛出。 - **`java.lang.UnsupportedClassVersionError`**:类版本不受支持时抛出。 ### 异常处理策略 针对以上提到的各种异常,合理的异常处理策略非常重要。以下...
如果某个线程的线程栈空间被耗尽,没有足够资源分配给新创建的栈帧,就会抛出 java.lang.StackOverflowError 错误。 线程栈是如何运行的? 首先给出一个简单的程序调用代码示例,如下所示: public class...
java.lang.StackOverflowError 异常的原因是 java 虚拟机栈内存溢出。解决方法是设置线程最大调用深度。参数是 -Xss。 10. java.lang.OutOfMemoryError 异常: java.lang.OutOfMemoryError 异常的原因是 java 堆...
去除死循环,解决StackOverflowError错误
错误通常表示系统级别的问题,这些问题是程序无法恢复的,比如`OutOfMemoryError`和`StackOverflowError`。错误通常由Java虚拟机(JVM)自身抛出,开发者一般不需要捕获它们,因为这些错误表明程序运行环境出现了...
`java.lang.StackOverflowError` 当程序递归调用层次太深或方法栈空间不足时,会抛出`StackOverflowError`。这种异常通常与递归算法的设计有关,或者是由于方法内部无限循环导致的。为了避免这类异常,可以通过...
【情况六】:`java.lang.StackOverflowError` 这是线程栈溢出错误,通常是由于方法调用层次过深或者无限递归。解决策略包括优化程序设计,减少不必要的方法调用,或者增大线程栈大小(通过`-Xss`参数)。 总结来说...
**定义**: `java.lang.StackOverflowError` 表示程序栈空间耗尽,通常是由于递归调用没有正确终止条件造成的。 **示例**: 下面的代码会导致栈溢出异常: ```java public static void main(String[] args) { main...
栈溢出会导致`java.lang.StackOverflowError`。 - **Program Counter Register**:每个线程都有一个程序计数器,用于记录当前线程正在执行的字节码指令的地址。 - **Native Method Stack**:与本地方法相关,当...