Java在Debug的时候,有些变量能无限展开(循环了)?

抛异常的时候,Java Debug 时,有些变量能无限展开,怎么做到的?

先来一个报错的例子:

Exception in thread "main" java.lang.StackOverflowError
 at llj.mf.ace.C.<init>(C.java:3)
 at llj.mf.ace.B.<init>(B.java:5)
 at llj.mf.ace.C.<init>(C.java:5)
 at llj.mf.ace.B.<init>(B.java:5)
 at llj.mf.ace.C.<init>(C.java:5)
 at llj.mf.ace.B.<init>(B.java:5)
 at llj.mf.ace.C.<init>(C.java:5)
 at llj.mf.ace.B.<init>(B.java:5)
 ....
 ....

报错的代码:

public class Ace {

	public static void main(String[] args) {
		new B();
	}

}

public class B {

	C c = new C();

}

public class C {

	B b = new B();

}

报错的原因:创建 B 对象的时候,B 对象会创建一个 C 对象,C 对象又会创建一个 B 对象,。。。这个会创建无数个 B 对象、C 对象,所以就 StackOverflowError 了

能无限展开的例子:

/**
 * 这个debug的时候,有无限个下级(循环了)(你中有我,我中有你)
 */
public class BCBC {

	public static void main(String[] args) {
		B b = new B();
		C c = new C();
		b.c = c;
		c.b = b;
		System.out.println(b.equals(c)); // 断点处
	}

	static class B {
		C c;
	}

	static class C {
		B b;
	}

}

上面示例 Debug 截图:

这里只创建了一个 B 对象、一个 C 对象,然后互相引用了而已(指向对方的地址)。(我指着你,你指着我: B <------> C)

这就解释了,为什么抛异常的时候,Java Debug 时,有些变量能无限展开

时间: 2024-11-06 10:55:49

Java在Debug的时候,有些变量能无限展开(循环了)?的相关文章

Java Remote Debug(idea远程调试)

概述 对于分布式系统的调试不知道大家有什么好的方法.对于我来说,在知道远程调试这个方法之前就是在代码中打各种log,然后重新部署,上线,调试,这样比较费时.今天咱们来了解了解Java远程调试这个牛逼的功能,本文以Intellij IDEA为例讲解怎么使用远程调试.以Thrift入门教程这篇文章中使用的程序作为例子.这个程序由Thrift服务端和客户端组成.描述一下远程调试需要解决的问题: 服务端程序运行在一台远程服务器上,我们可以在本地服务端的代码(前提是本地的代码必须和远程服务器运行的代码一致

Java线程工作内存与主内存变量交换过程及volatile关键字理解

Java线程工作内存与主内存变量交换过程及volatile关键字理解 1. Java内存模型规定在多线程情况下,线程操作主内存变量,需要通过线程独有的工作内存拷贝主内存变量副本来进行.此处的所谓内存模型要区别于通常所说的虚拟机堆模型: 2. 线程独有的工作内存和进程内存(主内存)之间通过8中原子操作来实现,如下图所示: 原子操作的规则(部分): 1) read,load必须连续执行,但是不保证原子性. 2) store,write必须连续执行,但是不保证原子性. 3) 不能丢失变量最后一次ass

java基础--JDK安装、环境变量配置、工具开发第一个程序、数据类型、运算符

**-----Java基础大纲-----**   **-----本章节-----** 1.Java语言的历史.特点及工作原理 2.JRE和JDK的介绍 3.Java运行环境和开发工具 4.Java基础语法 **-----下一章节-----** 5.条件语句 6.循环 7.数组 ============================================== 一:历史及开发准备 1.Java发展历程及来源 (1)发展历程 1996年1月,Sun公司发布了Java的第一个开发工具包(JD

【java】Windows7 下设置环境变量

Windows 7下配置JDK环境变量參数设置: 1.    安装JDK,安装过程中能够自己定义安装文件夹等信息,比如我们选择安装文件夹为:D:\Program Files (x86)\Java\jdk1.6.0_25 2.    安装完毕后,右击"我的电脑",点击"属性",单击"高级系统设置",点击"环境变量",如图: 4.    在"系统变量"中,设置3项属性,JAVA_HOME,PATH,CLASSP

java中的关键字static(静态变量)和final定义常量

1 package point; 2 3 class Point { 4 5 int x = 0; 6 int y = 0; 7 static int z = 100; // 定义静态变量z,类变量 8 static final double PI = 3.1415926;// final定义常量,它的值在运行时不能被改变 9 10 Point(int a, int b) { 11 //PI=3.1415926; 12 /* 13 * 当使用静态常量的时候,不能在构造函数中初始化, 因为静态时,

Java知多少(20)变量的作用域

在Java中,变量的作用域分为四个级别:类级.对象实例级.方法级.块级. 类级变量又称全局级变量或静态变量,需要使用static关键字修饰,你可以与 C/C++ 中的 static 变量对比学习.类级变量在类定义后就已经存在,占用内存空间,可以通过类名来访问,不需要实例化. 对象实例级变量就是成员变量,实例化后才会分配内存空间,才能访问. 方法级变量就是在方法内部定义的变量,就是局部变量. 块级变量就是定义在一个块内部的变量,变量的生存周期就是这个块,出了这个块就消失了,比如 if.for 语句

Java 入门(一) - 环境变量

Win 7 X64环境 计算机(右键)-> 属性 -> 高级系统设置 -> 环境变量1.新建系统变量 : JAVA_HOME C:\Program Files (x86)\Java\jdk1.6.0_10(你的JDK安装路径)2.修改系统变量 :PATH %JAVA_HOME%\bin;%JAVA_HOME%\jre\bin3.新建系统变量:CLASSPATH.;%JAVA_HOME%\lib;%JAVA_HOME%\lib\tools.jar (要加.表示当前路径) 测试Java环境:

浅谈Java中path、classpath环境变量的配置问题

一. 编译和运行Java程序必须经过两个步骤: 1.将源文件编译成字节码: 2.解释执行平台无关的字节码程序. 二.问题 以上两个步骤分别需要使用javac和java两个命令(javac命令对java源文件进行编译生成class文件,java命令对生成的class文件进行运行),如果我们直接在cmd命令行窗口里依次输入javac和java命令,可能会看到以下错误: 另外当我们移动了class文件后,执行java命令时,会出现以下错误: 三.分析问题 我们已经在计算机里安装了JDK,而jdk的安装

Java学习日记8-包、环境变量和访问控制

Java中的包.环境变量和访问控制 一.java中的包 Java利用包来组织代码,一来使大型项目的代码结构清晰,二来包是一个命名空间的划分,即不同包中可以有相同名字的类,只需在在类名前加上包名即可区分它们. Package xxx 必须位于java文件除了注释以外的第一行,用来指明当前文件中的类属于哪一个包,如果没有package语句,则该文件中的类都属于默认包. Import xxx用来在当前java文件中导入不属于当前包中的类,从而可以在当前文件中使用它们. 二.java中的环境变量 1.p