IDEA toString 预编译导致调试结果不准确问题

1.问题复现

public class ZTestToString {
	private static List<String> list = new ArrayList<>();

	public static void main(String[] args) {
		ZTestToString zTestToString = new ZTestToString();
		System.out.println("e1");
		System.out.println("e1");
		System.out.println(list.size());
	}

	public static List<String> getList() {
		return list;
	}

	public static void addList() {
		list.add("1");
	}

	@Override
	public String toString() {
		addList();
		return "ZTestToString{" +
				"list=" + list +
				'}';
	}
}

这是一段非常简单的代码,如果是运行的情况下,最终打印出来的结果一定是0,但是在调试阶段,打印的却有可能是 1,2,甚至3,严重干扰我们的判断,如下
在这里插入图片描述
在这里插入图片描述
这是因为当我们创建对象时,IDEA 为了显示对象的信息会默认去调用 toString 方法,如果你再 toString 中做了一些操作就会出现这个问题,toString 调用的次数取决于你断点调试的次数,如果你是一行一行调试的,那就每次都会调用,如果你没断点,IDEA 不需要显示视图就不会调用,最终调试结果就是对的,并且如果是发生在 toString 中的操作,断点也会被跳过,出现这样的提示
在这里插入图片描述

2.解决办法

在这里插入图片描述
去掉 toString 对象视图的设置就行

3.问题来源

在这里插入图片描述
在看 spring 对于类型的封装时,在 cache.put 进去之前,cache 中莫名其妙就有数据,一开始以为是代理执行的,改了字段名后发现也不行,然后又怀疑是线程,就改多线程调试模式也不行,最终过了很久才观察到有句断点跳过的提示,在网上找到了方法,看了下 toString 方法,确实会导致 cache 中添加了数据
在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值