
为什么 debug 时不会进入调用的方法?
在调试过程中,断点会自动跳过某些方法的调用。当代码执行到标注断点行时,通常会立即触发断点并停止执行,不会进入后续方法中。
示例情况:
如下图所示,代码在 callme() 方法中报空指针异常。然而,在调试运行时,断点直接在报错行停止,无法进入 dosomething() 方法进行调试。
void callme() {
dosomething(); // 报空指针异常
}
void dosomething() {
// 代码省略
}原因:
代码块执行时,虚拟机将方法函数的参数及局部变量压入栈中。当方法调用时,新的方法函数的参数及局部变量会压入新的栈帧中。
思乐微信商城微分销系统是以.net+access/mssql进行开发的微信分销系统。基于微信朋友圈的传播,是打造以分销商为中心的全新微信分销体验。让粉丝实时有效的获取朋友圈流量并快速分享购买分佣。因为是基于微信,所以要在微信上体验才更好。关注我们的微信核心功能:1、自动提示用户关注微信,解决一般程序无关注微信公众号的过程2、只要通过链接进一次,不过好久注册,什么方面注册,只要是用微信注册的,都会算
当异常发生时,虚拟机会执行以下步骤:
- 回溯栈帧:从当前栈帧回溯到异常发生时的栈帧。
- 清除局部变量:清理当前栈帧中的所有局部变量,包括方法参数。
- 抛出异常:将异常对象抛出到上级栈帧。
解释:
在这种情况下,由于异常发生在 dosomething() 方法中,虚拟机会回溯到 callme() 方法的栈帧。此时,dosomething() 方法的局部变量已经被清除,包括调用的 this 对象,因此引发空指针异常。
解决方案:
为了能够在调试过程中进入调用的方法,可以在 callme() 方法中使用 try-catch 块捕获异常,并手动通过 printstacktrace() 方法打印异常信息。这样可以保留 dosomething() 方法的栈帧和局部变量,从而方便调试。
void CallMe() {
try {
DoSomething();
} catch (Exception e) {
e.printStackTrace();
}
}









