Expression视图默认不自动求值,需手动点击Evaluate按钮或按Ctrl+Enter触发;断点暂停、变量可见、非代理对象是前提,远程调试需启用JDWP并配置允许表达式处理。

Expression视图里输入user.getName()没反应?检查表达式是否已启用求值
MyEclipse的Expression视图默认不自动执行表达式,只显示“Pending”或空白——这不是bug,是安全机制。必须手动点击表达式右侧的Evaluate按钮(或按Ctrl+Enter)才会触发求值。
- 断点停住后,右键
Expression视图空白处 →Add Expression,输入user.getName(),别回车就走 - 确认当前线程处于暂停状态(非“running”),且
user变量在当前作用域可见(可在Variables视图里先确认存在) - 如果抛出
NullPointerException,说明user为null,此时表达式求值失败但不会报错提示,只会显示error字样
为什么list.size()返回0,但list明明有元素?注意集合代理对象问题
MyEclipse调试时,Hibernate/JPA代理对象、Spring AOP增强对象常以$Proxy或CGLIB类名呈现,直接调用size()可能返回0或抛UnsupportedOperationException——因为底层实际是未初始化的懒加载代理。
- 优先在
Variables视图中展开list节点,看是否有handler或target字段,找到真实集合实例再取值 - 改用
((java.util.ArrayList) list).size()强制转型(仅当确定类型时),或用list.getClass().getName()确认真实类型 - 避免在Expression中调用可能触发懒加载的方法(如
list.get(0)),这会引发额外SQL查询甚至事务异常
Expression里能写多行代码吗?不能,但可用分号链式调用
MyEclipse的Expression视图只支持单行Java表达式,不支持语句块、if、for等结构。不过可以用分号连接多个表达式,最后一个表达式的值作为结果返回。
- 合法:
String s = "hello"; s.toUpperCase();→ 返回"HELLO" - 非法:
if (x > 0) { return x; }(语法错误) - 注意副作用:
map.put("k", "v"); map.get("k")会真实修改原对象,调试中慎用 - 复杂逻辑建议写到临时Java文件里编译运行,而非硬塞进Expression
调试远程Tomcat时Expression求值失败?检查Debug配置里的Allow remote debugging
本地调试没问题,远程调试Expression全灰掉或提示“Not available”,大概率是Tomcat启动参数没开JDWP权限,或MyEclipse Debug配置未启用远程评估。
- 确保Tomcat启动加了:
-agentlib:jdwp=transport=dt_socket,server=y,suspend=n,address=*:8000 - MyEclipse中右键项目 →
Debug As→Debug Configurations→ 选中对应Remote Java Application → 勾选Allow termination of remote VM和Allow processing of expressions - 防火墙需放行
8000端口,且address=*不能写成localhost:8000(否则Expression无法反向连接)
System.out.println临时输出,也比在Expression里反复试错更可靠。