我使用的是最新的IntelliJ IDEA Ultimate 16 EAP。我在库中有一些代码用一些setter初始化一个对象:
X createSomething() {
X x = new X();
x.setY(z);
return x; // breakpoint on this line
}
我希望从调试器修改此返回值的状态:调用x.setY(y)
。我尝试了条件,因为我希望它发生在断点处断点的每次击中并使用"评估表达式"窗户是不可行的。
不可能以任何正常的面向对象的方式(例如覆盖该方法)执行此操作,也不可能在方法之外捕获结果并在那里修改它因为它深在很多电话中。
以下是我的尝试,由于调试器中不支持这些语言功能而全部失败。他们通过对话询问"你想在断点处停下来失败了吗?"。语言级别固定为Java 6-7,因为我正在为Android开发。
处理VM事件的问题:
断点:ClassName.createSomething()
(包)中的第9行'
错误:无法评估断点条件'x.setY(y)
'
原因:预期布尔值
还尝试了类似的变体:x.setY(y); false;
,但它需要是一个表达式。
处理VM事件的问题:
断点:ClassName.createSomething()
(包)中的第9行'
错误:无法评估断点条件'() -> { x.setY(y); return false; }
'
原因:不支持Lambda评估
处理VM事件的问题:
断点:ClassName.createSomething()
(包)中的第9行'
错误:无法评估断点条件&#39;new java.util.concurrent.Callable<Boolean>() { @Override public Boolean call() { x.setY(y); return false; } }.call()
&#39;
原因:不支持匿名类评估
我找到了一个我想要分享的解决方法,但如果有人知道,我仍然在寻找更好的解决方案:不需要重新编译和重新启动。
在类中创建方法:
public class SomeClass {
public static boolean fixX(X x) {
x.setY(y);
return false; // don't actually stop on the breakpoint
}
}
在断点条件中添加
full.pkg.SomeClass.fixX(x)
这样可行,但只要您想要修改条件,您就必须重新启动应用。参数化fixX(x, changeAbleY)
是解决方案。
确保在调试不相关的问题时禁用或删除断点以防止因修改后的行为而出现问题。
答案 0 :(得分:2)
步骤:
参考:https://www.jetbrains.com/idea/help/configuring-breakpoints.html
屏幕截图:Screenshot of breakpoint configuration window.
IntelliJ有一项功能可以添加&#34;手表&#34;你可以在哪里执行你的void方法,但这是手册,而不是自动的。