我正在尝试为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]
任何帮助都将受到高度赞赏。
答案 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
来查看抛出的实际异常。