欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

IDEA中Debugger模式下的toString()方法

程序员文章站 2022-06-07 20:07:50
...

最近在看Zxing的源码,使用IDEA打断点调试时,发现了一个问题, toString() 方法会自动执行,找不到谁调用的它,就百思不得其解.

问题

  • 类 BinaryBitmap 中的 toString 方法里面有个赋值语句,给变量 matrix 赋值.
  • 在调试过程中,我没有调用该 toString 方法,但断点结果却显示 matrix 有值,而且就是 toString 中的执行结果,
  • 就很纳闷,难道 toString 方法是什么特殊体质?
  • 于是自己仿造类 BinaryBitmap 写了个测试类,看到底是什么原因.

测试代码

import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

public class TestToString {
    private List<String> list = null;
    private Map<String, String> map = null;

    public static void main(String[] args) {
        List<String> list = new ArrayList<>();
        list.add("xiaoming");
        list.add("xiaohua");
        TestToString testToString = new TestToString(list);

        // 直接运行结果为null, debugg时会显示 datou
        System.out.println(testToString.map);
    }


    public TestToString(List<String> list) {
        this.list = list;
    }

    @Override
    public String toString() {
        System.out.println("toString");
        if(map == null) {
            Map<String, String> hashMap = new HashMap<>();
            hashMap.put("name", "datou");
            map = hashMap;
        }

        return list.toString() + map.toString();
    }

}

运行结果

  • 在第17行打断点,debugger模式下会发现变量 map 是有值的,且执行了 toString 方法中的打印语句.
  • 如果直接运行程序,会发现变量 map 为 null, toString 中的打印语句也没有执行.
  • 所以猜测 toString 方法自动执行和 debugger 模式有关.
  • 在后面多次测试时,发现一个有趣的现象,在 debugger 模式下,鼠标移动到变量 testToString 上面,IDEA 会有一个弹窗,显示该变量的信息,然后控制台就会输出一条 toString 方法中的打印语句.

总结

  • 最后发现 toString 方法其实是 IDEA 的调试工具调用的,因为它需要调用 toString 方法来在弹框中展示这个变量的信息,并且不会跳转到 toString 方法中的断点.
  • 所以 toString 方法只能由它所属对象来调用是对的,不会出现自动调用的情况,
  • 至于 IDEA 的 Debugger 工具是怎么调用 toString 的,就不清楚了,可能是通过反射吧.
相关标签: 土味 java debug