为什么 Debug 时会跳过方法调用?
为什么 debug 时不会进入调用的方法?
在调试过程中,断点会自动跳过某些方法的调用。当代码执行到标注断点行时,通常会立即触发断点并停止执行,不会进入后续方法中。
示例情况:
如下图所示,代码在 callme() 方法中报空指针异常。然而,在调试运行时,断点直接在报错行停止,无法进入 dosomething() 方法进行调试。
void callme() { dosomething(); // 报空指针异常 } void dosomething() { // 代码省略 }
原因:
代码块执行时,虚拟机将方法函数的参数及局部变量压入栈中。当方法调用时,新的方法函数的参数及局部变量会压入新的栈帧中。
当异常发生时,虚拟机会执行以下步骤:
- 回溯栈帧:从当前栈帧回溯到异常发生时的栈帧。
- 清除局部变量:清理当前栈帧中的所有局部变量,包括方法参数。
- 抛出异常:将异常对象抛出到上级栈帧。
解释:
在这种情况下,由于异常发生在 dosomething() 方法中,虚拟机会回溯到 callme() 方法的栈帧。此时,dosomething() 方法的局部变量已经被清除,包括调用的 this 对象,因此引发空指针异常。
解决方案:
为了能够在调试过程中进入调用的方法,可以在 callme() 方法中使用 try-catch 块捕获异常,并手动通过 printstacktrace() 方法打印异常信息。这样可以保留 dosomething() 方法的栈帧和局部变量,从而方便调试。
void CallMe() { try { DoSomething(); } catch (Exception e) { e.printStackTrace(); } }
以上就是为什么 Debug 时会跳过方法调用?的详细内容,更多请关注其它相关文章!