如何防止Android中的异常捕获?

如何防止Android中的异常捕获?,android,exception,exception-handling,Android,Exception,Exception Handling,我正在尝试为Android开发一个应用程序,但是我在追踪过程中遇到的每个异常的来源和原因时遇到了困难。 我的代码在一个活动中运行,如果我的一行代码导致了一个异常,那么它不会在该行上停止并突出显示它,而是将我扔进ActivityThread类的代码中,显然我没有,所以我只会得到一个“Source not found”屏幕 试图找到这样麻烦的一行是非常令人沮丧的,所以我试图找到一种方法来防止Android的代码在开发过程中捕捉到每一个异常。 我在网上的搜索没有得到关于我如何做这件事的信息,所以我决定

我正在尝试为Android开发一个应用程序,但是我在追踪过程中遇到的每个异常的来源和原因时遇到了困难。 我的代码在一个活动中运行,如果我的一行代码导致了一个异常,那么它不会在该行上停止并突出显示它,而是将我扔进ActivityThread类的代码中,显然我没有,所以我只会得到一个“Source not found”屏幕

试图找到这样麻烦的一行是非常令人沮丧的,所以我试图找到一种方法来防止Android的代码在开发过程中捕捉到每一个异常。 我在网上的搜索没有得到关于我如何做这件事的信息,所以我决定在这里询问

以下是在代码中引发异常之前的堆栈跟踪:

线程[主](挂起 (GameView中第72行的断点))
GameView.showMenu()行:72
GameView.init()行:59
游戏视图。(上下文, 属性集)行:51
Constructor.constructNative(对象[], 类,类[],整型,布尔型)行: 不可用[本机方法] 构造函数.newInstance(对象…) 电话:415 PhoneLayoutFlater(LayoutFlater).createView(字符串, 字符串,属性集)行:505
PhoneLayoutFlater(LayoutFlater).createViewFromTag(字符串, 属性集)行:570
PhoneLayoutInflater(LayoutInflater).rInflate(XmlPullParser, 视图,属性集)行:623 PhoneLayoutFlater(LayoutFlater)。充气(XmlPullParser, 视图组,布尔值)行:408 充气(内部, 视图组,布尔值)行:320 充气(内部, 视图组)行:276
PhoneWindow.setContentView(int)行: 207
MainActivity(Activity).setContentView(int) 行:1657
MainActivity.onCreate(Bundle)行: 20
Instrumentation.callActivityOnCreate(活动, 捆绑)线路:1047
ActivityThread.performLaunchActivity(ActivityThread$ActivityClientRecord, 意图)行:1586
ActivityThread.handleLaunchActivity(ActivityThread$ActivityClientRecord, 意图)行:1638
ActivityThread.access$1500(ActivityThread, ActivityThread$ActivityClient记录, (a)第117行 ActivityThread$H.handleMessage(消息) 电话号码:928 ActivityThread$H(处理程序).dispatchMessage(消息) 行:99 Looper.loop()行:123 ActivityThread.main(字符串[])行: 3647方法。invokenactive(对象, 对象[],类,类[],类,int, 布尔值)行:不可用[本机] 方法]方法。调用(对象, 对象…)行:507
ZygoteInit$MethodAndArgsCaller.run() 行:839 ZygoteInit.main(字符串[]) 行:597 nativestar.main(字符串[]) 行:不可用[本机方法]

以下是Eclipse因异常而停止执行后的堆栈跟踪:

线程[主](挂起 (异常运行时异常) ActivityThread.performLaunchActivity(ActivityThread$ActivityClientRecord, 意图)行:1622
ActivityThread.handleLaunchActivity(ActivityThread$ActivityClientRecord, 意图)行:1638
ActivityThread.access$1500(ActivityThread, ActivityThread$ActivityClient记录, (a)第117行 ActivityThread$H.handleMessage(消息) 电话号码:928 ActivityThread$H(处理程序).dispatchMessage(消息) 行:99 Looper.loop()行:123 ActivityThread.main(字符串[])行: 3647方法。invokenactive(对象, 对象[],类,类[],类,int, 布尔值)行:不可用[本机] 方法]方法。调用(对象, 对象…)行:507
ZygoteInit$MethodAndArgsCaller.run() 行:839 ZygoteInit.main(字符串[]) 行:597 nativestar.main(字符串[]) 行:不可用[本机方法]


非常感谢您的帮助。

我觉得您应该将有问题的代码包装在try/catch块中,这样您就可以(a)优雅地处理异常,(B)在catch块中设置断点,并在调试时检查变量。还是我误解了

编辑:

例如,如果您有一个活动,并且您在onCreate中(我的Android fu有点生锈),并且它是

public void onCreate(Bundle blahblah) {
  My code here
}
你反而会这么做

public void onCreate(Bundle blahblah) {
  try { 
    My code here
  } catch (Exception e) {
    Log.d(Do something to print your stacktrace here); <-- Set your breakpoint here
  }
}
public void onCreate(Bundle blahblah){
试试{
我的代码在这里
}捕获(例外e){

Log.d(在此处打印堆栈跟踪);堆栈跟踪中的第一行显示其爆炸的位置。在您的情况下:

Thread [<1> main] (Suspended (breakpoint at line 72 in GameView))
GameView.showMenu() line: 72
GameView.init() line: 59
GameView.(Context, AttributeSet) line: 51
Thread[main](挂起(GameView中第72行的断点))
GameView.showMenu()行:72
GameView.init()行:59
游戏视图。(上下文,属性集)行:51

当调试器像那样中断时,只需继续执行(可能需要执行2到3次)。然后查看LogCat输出以获得有意义的堆栈跟踪。

对我来说,该输出看起来不像是异常的堆栈跟踪。这只是从调试角度看像是
线程
信息。尝试在ddms透视图或ddms独立工具中使用
LogCat
查看actu所有抛出的异常。

谢谢,这很有帮助。在继续执行几次之后,我确实可以在LogCat输出中看到一堆错误消息,包括一行专门指向代码中抛出异常的位置。我甚至可以双击它,它将我带到代码中的那一行。=)正如我所说的,这堆栈跟踪发生在引发异常之前,我之前故意停止了这一行。我只能在已经知道是哪一行导致了问题时才这样做,这正是我想知道的。如果我不知道是哪一个方法导致了问题,我不能这样做,我不能用try包装每个方法实现/为了调试而捕获块。MainActivity.onCreate中的第20行似乎是一个很好的开始。