如何解释调试信息?

时间:2010-12-02 14:39:44

标签: android

这实际上是两个问题。第一个涉及我的程序,第二个是关于调试的更一般的问题。

在我的代码中,我有两个按钮监听器。单击第一个时,onClickListener将创建locationlistener,以及从locationlistener请求更新的LocationManager。 (见下文......)

LocationManager locationManager = (LocationManager)  getSystemService(Context.LOCATION_SERVICE);
locationManager.requestLocationUpdates(LocationManager.GPS_PROVIDER, 0, 0, locationlistener);

点击第二个按钮,我尝试取消注册监听器,如下所示......

locationManager.removeUpdates(LocationListener的);

但是,我最终在调试器中关闭了一个强制关闭信息......

ERROR/AndroidRuntime(310): FATAL EXCEPTION: main
ERROR/AndroidRuntime(310): java.lang.NullPointerException
ERROR/AndroidRuntime(310):     at com.ryan.gcal.GRunCal$2.onClick(GRunCal.java:94)
ERROR/AndroidRuntime(310):     at android.view.View.performClick(View.java:2408)
ERROR/AndroidRuntime(310):     at android.view.View$PerformClick.run(View.java:8816)
ERROR/AndroidRuntime(310):     at android.os.Handler.handleCallback(Handler.java:587)
ERROR/AndroidRuntime(310):     at android.os.Handler.dispatchMessage(Handler.java:92)
ERROR/AndroidRuntime(310):     at android.os.Looper.loop(Looper.java:123)
ERROR/AndroidRuntime(310):     at android.app.ActivityThread.main(ActivityThread.java:4627)
ERROR/AndroidRuntime(310):     at java.lang.reflect.Method.invokeNative(Native Method)
ERROR/AndroidRuntime(310):     at java.lang.reflect.Method.invoke(Method.java:521)
ERROR/AndroidRuntime(310):     at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:868)
ERROR/AndroidRuntime(310):     at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:626)
ERROR/AndroidRuntime(310):     at dalvik.system.NativeStart.main(Native Method)

我的代码的第94行,其中出现错误,是我尝试删除位置监听器的地方。所以我假设我没有正确删除位置监听器,但我不确定是什么问题。我的LocationManager在代码的开头声明...

Locationmanager locationManager;

我的第一个问题是,在删除监听器时我做错了什么?其次,任何人都可以提供一些有关学习如何有意义地解释调试错误的提示/建议吗?感谢。

3 个答案:

答案 0 :(得分:1)

回答你的第二个问题。要了解所有异常和错误的含义,您只需查阅参考页面,您可以在http://d.android.com找到该参考页面。此外,异常/错误消息非常有用,因为它可以告诉您大多数时候出了什么问题。

另外,当查看堆栈跟踪时,会显示完全限定的类名(即包含包名的类名)以及发生异常的方法或触发异常的方法,并在括号中再次找到类名以及抛出异常的代码行号。

答案 1 :(得分:1)

由Octavians解释:

ERROR/AndroidRuntime(310): java.lang.NullPointerException
ERROR/AndroidRuntime(310):     at    com.ryan.gcal.GRunCal$2.onClick(GRunCal.java:94)

在GRunCal类中定义的onClick方法中的含义,特别是在第94行,您最有可能在空值上调用方法。检查代码后,这一点应该很明显。

例如:

View myCustomComponent;
public void onClick(View v)
{
    myCustomComponent.doSomething();// Null pointer exception would be thrown. because myCustomComponent hasn't been assigned.
}

您可以在第94行之前设置一个断点,然后观察您的方法的值。从那里回来发现实际上失败的东西。

编辑后。

ERROR/AndroidRuntime(286): Caused by: java.lang.ClassCastException: android.content.Intent

我认为,但不能确定这是由以下情况引起的。

public void onClick(View v)
{
    Thread nonsense = (Thread)v;
}

即。上面的代码是无意义的,非常确定你不能将视图作为一个线程进行转换,但重点是抛出一些东西,因为另一种类型会抛出这样的错误。

答案 2 :(得分:1)

您需要:

A)将locationManager实例定义为类变量,或者在onclick中再次检索它。

LocationManager locationManager;

public void onClick1()
{
    locationManager = (LocationManager)  getSystemService(Context.LOCATION_SERVICE);
            locationManager.requestLocationUpdates(LocationManager.GPS_PROVIDER, 0, 0, locationlistener);

}

public void onClick2()
{
    locationManager.removeUpdates(locationlistener);
}

您需要确保在onClick1()而不是

LocationManager locationManager = (LocationManager)  getSystemService(Context.LOCATION_SERVICE);

你把

locationManager = (LocationManager)  getSystemService(Context.LOCATION_SERVICE);

指定LocationManager locationManager使声明的范围包含在其指定的方法中,而不是在类的范围内。这意味着在您的第二次单击中,locationManager实际上为空。