这实际上是两个问题。第一个涉及我的程序,第二个是关于调试的更一般的问题。
在我的代码中,我有两个按钮监听器。单击第一个时,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;
我的第一个问题是,在删除监听器时我做错了什么?其次,任何人都可以提供一些有关学习如何有意义地解释调试错误的提示/建议吗?感谢。
答案 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实际上为空。