Eclipse调试HashMap:使用Key和Value的toString()方法的逻辑结构

ltf*_*hie 20 java eclipse debugging eclipse-plugin

我最近在使用IntelliJ几年后开始使用Eclipse.使用IntelliJ调试Map时,如果键或对象实现toString(),则会显示一个很好的键值字符串表示列表.

在Eclipse中,当我选择Show Logical Structure时,我看到如下内容:

在此输入图像描述

此视图的问题是您需要展开每个条目以查看实际的键和值.如果你需要在超过10个元素的地图中找到某些东西,那就变得非常繁琐了.

我知道你可以制作自定义逻辑结构,Map的默认值看起来像这样:

return entrySet().toArray();
Run Code Online (Sandbox Code Playgroud)

有没有办法,通过自定义逻辑结构插件来查看更有用的地图条目

ConcurrentHashMap$WriteThroughEntry (id=193)
Run Code Online (Sandbox Code Playgroud)

小智 57

您需要在逻辑结构之上创建详细格式化程序.在您提供的示例屏幕截图中,您的逻辑结构是ConcurrentHashMap $ WriteThroughEntry.您可以通过右键单击包含ConcurrentHashMap $ WriteThroughEntry的行并选择"添加详细格式化程序"来添加详细格式化程序.

我刚刚使用HashMap敲了这个例子.

在此输入图像描述

java.util.HashMap$Entry //  key + " - " + value
Run Code Online (Sandbox Code Playgroud)

为一个

HashMap<Integer,String> map;
Run Code Online (Sandbox Code Playgroud)

..我很快就填满了垃圾,我现在看到:

在此输入图像描述

  • 有趣的是,这不适用于eclipse 3.7中的OS X,我认为是因为Apple的JVM.当我尝试为内部类定义详细格式化程序时出错.但这是怎么做的.请注意,您可以通过选择第一个单选按钮来最小化对变量视图的更改. (2认同)
  • 请将“变量”视图的屏幕截图放大一点,并圈出“显示逻辑结构”按钮。 (2认同)

Bar*_*lom 10

好吧,我做了一个丑陋的解决方法.为Map设置此详细格式化程序:

StringBuilder detail = new StringBuilder();
int i = 0;
for (Object k : keySet()) {
    detail.append((i++) + ": " + k + "\n");
}
return detail;
Run Code Online (Sandbox Code Playgroud)

然后在其输出中,找到具有所需键的条目的索引,然后在逻辑结构树中查找该条目.

它有效,但细节格式化程序本身有点慢,需要额外的步骤.此外,键没有排序,因此在大型地图中找到所需的键可能很困难(尽管理论上可以在格式化程序中进行排序).


Mik*_*lov 9

我发现当我在调试器的"变量"窗格中选择一个值时,使用toString()方法显示其值.例如,这适用于地图.