您可以先验证 Eclipse 中的此设置是否已启用。
窗口 -> 首选项 -> Java -> 调试 -> 在未捕获的异常时暂停执行
如果启用此设置,则任何未捕获的异常都将在 JVM 引发的位置暂停 JVM,包括使用反射调用的类。这是没有添加任何断点,但前提是它未处理,即您的代码甚至不被来自 try-catch 的外部代码调用。
例如:
int a = 0, b= 0;
System.out.println(a/b); // ArithmeticException
即使此代码是从反射调用的代码中调用的,eclipse 也会在 sysout 挂起,并且堆栈上仍有所有变量可用。
然而,在Android的创业类ZygoteInit
中,有这样一行:
catch (Throwable t) {
Log.e(TAG, "Error preloading " + line + ".", t);
if (t instanceof Error) {
throw (Error) t;
}
if (t instanceof RuntimeException) {
throw (RuntimeException) t;
}
throw new RuntimeException(t);
}
这样的代码会破坏Eclipse调试的原因是,现在已经不再无人处理了。您实际上可能正在捕获启动类而不是您的用户代码。这是针对常规日食的。RuntimeException
UncaughtExceptionHandler
解决方案 1 :
- 转到运行 -> 添加 Java 异常断点 ->
Throwable
- 在断点视图中单击
Throwable
- 右键单击 -> 断点属性 ->添加包 -> 确定
- 检查此异常的选项子类
注意:这可以勉强抓住一个,但绝对不能抓住一个。java.lang.OutOfMemoryError
java.lang.StackOverflowError
解决方案2:(仅当捕获的异常过多时,不建议以其他方式使用))
- 将源代码复制到新项目说
com.android.internal.os.ZygoteInit
MyBootstrap
-
将块修改为仅捕获catch (Throwable t)
Error
} catch (Error t) {
Log.e(TAG, "Error preloading " + line + ".", t);
throw t;
}
转到调试配置 ->类路径 -> 单击引导程序项 -> 添加项目 -> 。将此项目移到顶部MyBootstrap