我正在开发一个表达式评估器。有一个 evaluate()
函数,根据处理的表达式的复杂性,该函数会被调用多次。
我需要中断并调查此方法何时返回 null。有很多路径和返回语句。
可以在退出方法事件上中断,但我找不到如何设置有关返回值的条件。
最佳答案
我也陷入了这种沮丧之中。人们可以检查(并编写条件)命名变量,但不能检查返回值等未命名的内容。这里有一些想法(对于任何可能感兴趣的人):
- 可以在断点条件中包含类似
evaluate() == null
的内容。执行的测试(Eclipse 4.4)表明,在这种情况下,该函数将出于断点目的而再次执行,但这次断点禁用。所以你至少可以避免堆栈溢出的情况。 这是否有用,取决于所考虑的函数的性质 - 它会在断点时返回与运行时相同的值吗?(有些 s[a| i]要测试的简单代码:)
class TestBreakpoint {
int counter = 0;
boolean eval() { /* <== breakpoint here, [x]on exit, [x]condition: eval()==false */
System.out.println("Iteration " + ++counter);
return true;
}
public static void main(String[] args) {
TestBreakpoint app = new TestBreakpoint();
System.out.println("STARTED");
app.eval();
System.out.println("STOPPED");
}
}
// RESULTS:
// Normal run: shows 1 iteration of eval()
// Debug run: shows 2 iterations of eval(), no stack overflow, no stop on breakpoint
- 另一种使其更容易(将来可能进行调试)的方法是采用编码约定(或个人编码风格),要求人们声明本地在函数内部设置的变量,最后只返回一次。例如:
public MyType evaluate() {
MyType result = null;
if (conditionA) result = new MyType('A');
else if (conditionB) result = new MyType ('B');
return result;
}
那么您至少可以使用 result == null
等条件设置退出断点。然而,我同意这对于简单的函数来说是不必要的冗长,与语言允许的流程有点相反,并且只能手动强制执行。 (就我个人而言,我有时确实会在更复杂的函数中使用此约定(名称result
“保留”仅用于此用途),它可能使事情变得更清晰,但不适用于简单的函数。但是很难划清界限;就在今天早上,我们不得不单步执行一个简单的函数,看看 3 种可能的情况中哪一个是被触发的。对于当今复杂的系统,人们希望避免单步执行。)
- 除此之外,您需要根据具体情况修改代码,如上一点所示,以便单个函数将返回值分配给某个变量,您可以测试该变量。如果某些工作政策不允许您进行此类非功能性更改,那么您就会陷入困境......当然,如果原始代码有点复杂,这样的重写也可能导致无意中解决错误,所以谨防调试后恢复到原来的状态,却发现bug又回来了。
关于eclipse - 当方法在 Eclipse 调试器中返回 null 时中断,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18977917/