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

时间:2011-03-17 17:28:13

标签: android exception exception-handling

我正在尝试为Android开发一个应用程序,但是我很难跟踪我在此过程中遇到的每个异常的来源和原因。 我的代码在一个Activity中运行,如果我的一行导致异常,那么它不是停在那一行并突出显示它,而是将我引入ActivityThread类的代码,这显然是我没有的,所以我得到一个“未找到来源”屏幕。

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

以下是在我的代码中抛出异常之前的堆栈跟踪:

  

线程[< 1>主要](暂停   (GameView第72行的断点))
    GameView.showMenu()行:72
    GameView.init()行:59
    GameView(背景下,   AttributeSet)line:51
    Constructor.constructNative(对象[],   Class,Class [],int,boolean)行:   不可用[原生方法]     Constructor.newInstance(对象...)   行:415     PhoneLayoutInflater(LayoutInflater).createView(字符串,   String,AttributeSet)行:505
    PhoneLayoutInflater(LayoutInflater).createViewFromTag(字符串,   AttributeSet)line:570
    PhoneLayoutInflater(LayoutInflater).rInflate(XmlPullParser,   View,AttributeSet)行:623     PhoneLayoutInflater(LayoutInflater).inflate(XmlPullParser,   ViewGroup,boolean)行:408     PhoneLayoutInflater(LayoutInflater).inflate(INT,   ViewGroup,boolean)行:320     PhoneLayoutInflater(LayoutInflater).inflate(INT,   ViewGroup)行:276
    PhoneWindow.setContentView(int)行:   207个
    MainActivity(活动).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 $ ActivityClientRecord,   意图)行:117     ActivityThread $ H.handleMessage(消息)   行:928     ActivityThread $ H(处理器).dispatchMessage(消息)   line:99 Looper.loop()行:123     ActivityThread.main(String [])行:   3647 Method.invokeNative(Object,   Object [],Class,Class [],Class,int,   boolean)line:not available [native   方法] Method.invoke(Object,   对象...)行:507
    ZygoteInit $ MethodAndArgsCaller.run()   line:839 ZygoteInit.main(String [])   line:597 NativeStart.main(String [])   line:not available [native method]

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

  

线程[< 1>主要](暂停   (异常RuntimeException))     ActivityThread.performLaunchActivity(ActivityThread $ ActivityClientRecord,   意图)行:1622
    ActivityThread.handleLaunchActivity(ActivityThread $ ActivityClientRecord,   意图)行:1638
    ActivityThread.access $ 1500(ActivityThread,   ActivityThread $ ActivityClientRecord,   意图)行:117     ActivityThread $ H.handleMessage(消息)   行:928     ActivityThread $ H(处理器).dispatchMessage(消息)   line:99 Looper.loop()行:123     ActivityThread.main(String [])行:   3647 Method.invokeNative(Object,   Object [],Class,Class [],Class,int,   boolean)line:not available [native   方法] Method.invoke(Object,   对象...)行:507
    ZygoteInit $ MethodAndArgsCaller.run()   line:839 ZygoteInit.main(String [])   line:597 NativeStart.main(String [])   line:not available [native method]

任何帮助都将受到高度赞赏。

4 个答案:

答案 0 :(得分:7)

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

答案 1 :(得分:4)

听起来我应该将你的代码包装在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
  }
}

答案 2 :(得分:1)

堆栈跟踪中的第一行显示它在哪里爆炸。在你的情况下:

Thread [<1> main] (Suspended (breakpoint at line 72 in GameView))
GameView.showMenu() line: 72
GameView.init() line: 59
GameView.(Context, AttributeSet) line: 51

答案 3 :(得分:0)

对我来说,该输出看起来并不像它实际上是异常的堆栈跟踪。这看起来就像调试透视图中的Thread信息。尝试在ddms透视图或ddms独立工具中使用logcat来查看抛出的实际异常。