【问题标题】:NPE when invoking a method调用方法时的 NPE
【发布时间】:2012-01-31 12:06:39
【问题描述】:

为了删除应用程序数据,我尝试使用反射但在调用方法时获取 NPE

Class<?> myClass = Class.forName("android.content.pm.IPackageManager");
Method method = myClass.getMethod("clearApplicationUserData", String.class,IPackageDataObserver.class);
method.setAccessible(true);
Log.v("info",method.getName());
Object c = myClass .newInstance();
method.invoke(c,"com.example.android.apis",null);  //NPE

clearApplicationUserData 不返回任何内容并接受两个参数StringIPackageDataObserver

我传递的参数是否正确?

或者我该如何解决这个问题?

调试时的 StackTrace。

 01-31 17:50:07.125: V/info(969): clearApplicationUserData
 01-31 17:50:26.305: D/dalvikvm(969): newInstance failed: p0 i1 [0 a1
 01-31 17:50:26.305: W/System.err(969): java.lang.InstantiationException: android.content.pm.IPackageManager
 01-31 17:50:26.305: W/System.err(969):     at java.lang.Class.newInstanceImpl(Native Method)
 01-31 17:50:26.315: W/System.err(969):     at java.lang.Class.newInstance(Class.java:1479)
 01-31 17:50:26.325: W/System.err(969):     at f.c.v.ClearUserDataUsingInterfaceActivity.onCreate(ClearUserDataUsingInterfaceActivity.java:52)
android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1047)
01-31 17:50:26.355: W/System.err(969):  at           android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2459)
01-31 17:50:26.355: W/System.err(969):  at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2512)
01-31 17:50:26.365: W/System.err(969):  at android.app.ActivityThread.access$2200(ActivityThread.java:119)
01-31 17:50:26.365: W/System.err(969):  at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1863)
01-31 17:50:26.375: W/System.err(969):  at android.os.Handler.dispatchMessage(Handler.java:99)
01-31 17:50:26.375: W/System.err(969):  at android.os.Looper.loop(Looper.java:123)
01-31 17:50:26.385: W/System.err(969):  at android.app.ActivityThread.main(ActivityThread.java:4363)
01-31 17:50:26.385: W/System.err(969):  at java.lang.reflect.Method.invokeNative(Native Method)
01-31 17:50:26.395: W/System.err(969):  at java.lang.reflect.Method.invoke(Method.java:521)
01-31 17:50:26.395: W/System.err(969):  at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:860)
01-31 17:50:26.405: W/System.err(969):  at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:618)

01-31 17:50:26.405: W/System.err(969): at dalvik.system.NativeStart.main(Native Method)

和完整的堆栈跟踪。

 01-31 17:26:38.285: E/AndroidRuntime(920): Uncaught handler: thread main exiting due to uncaught exception
 01-31 17:26:38.295: E/AndroidRuntime(920): java.lang.RuntimeException: Unable to start activity ComponentInfo{f.c.v/f.c.v.ClearUserDataUsingInterfaceActivity}: java.lang.NullPointerException
 01-31 17:26:38.295: E/AndroidRuntime(920):     at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2496)
01-31 17:26:38.295: E/AndroidRuntime(920):  at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2512)
01-31 17:26:38.295: E/AndroidRuntime(920):  at android.app.ActivityThread.access$2200(ActivityThread.java:119)
01-31 17:26:38.295: E/AndroidRuntime(920):  at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1863)
01-31 17:26:38.295: E/AndroidRuntime(920):  at android.os.Handler.dispatchMessage(Handler.java:99)
01-31 17:26:38.295: E/AndroidRuntime(920):  at android.os.Looper.loop(Looper.java:123)
01-31 17:26:38.295: E/AndroidRuntime(920):  at android.app.ActivityThread.main(ActivityThread.java:4363)
01-31 17:26:38.295: E/AndroidRuntime(920):  at java.lang.reflect.Method.invokeNative(Native Method)
01-31 17:26:38.295: E/AndroidRuntime(920):  at java.lang.reflect.Method.invoke(Method.java:521)
01-31 17:26:38.295: E/AndroidRuntime(920):  at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:860)
01-31 17:26:38.295: E/AndroidRuntime(920):  at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:618)
01-31 17:26:38.295: E/AndroidRuntime(920):  at dalvik.system.NativeStart.main(Native Method)
01-31 17:26:38.295: E/AndroidRuntime(920): Caused by: java.lang.NullPointerException
01-31 17:26:38.295: E/AndroidRuntime(920):  at java.lang.reflect.Method.invokeNative(Native Method)
1-31 17:26:38.295: E/AndroidRuntime(920):   at java.lang.reflect.Method.invoke(Method.java:521)
01-31 17:26:38.295: E/AndroidRuntime(920):  at f.c.v.ClearUserDataUsingInterfaceActivity.onCreate(ClearUserDataUsingInterfaceActivity.java:57)
01-31 17:26:38.295: E/AndroidRuntime(920):  at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1047)
01-31 17:26:38.295: E/AndroidRuntime(920):  at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2459)
01-31 17:26:38.295: E/AndroidRuntime(920):  ... 11 more

【问题讨论】:

  • deleteClass 是什么?向我们展示堆栈跟踪。
  • 向我们展示堆栈跟踪。 NPE 是否被扔进了clearApplicationUserData?它很可能不支持 null 作为参数。
  • 所以实际上根本没有 NPE,当您尝试实例化和调用接口上的方法时,您会收到 InstantiationException。

标签: java android reflection methods


【解决方案1】:

IPackageManager 是一个接口(如“I”前缀所建议的那样)。您不能通过反射来实例化接口。

我猜你的意思是android.content.pm.PackageManager

【讨论】:

  • 如果我更改为 method.invoke(myClass,"com.example.android.apis",new IPackageDataObserver.Stub() { public void onRemoveCompleted(String packageName, boolean succeeded) throws RemoteException { Log. v("信息","成功"); } });然后我得到object is not an instance of the class的异常
  • 您应该更改Class&lt;?&gt; myClass = Class.forName("android.content.pm.IPackageManager");,因为 IPackageManager 是一个接口。检查docs.oracle.com/javase/1.5.0/docs/api/java/lang/…,你会明白为什么你会得到instantiationException。
  • 如何访问 IPackageMnager.aidl 中定义的这些方法
  • 通过实例化一个实现 IPackageManager 接口的类。
【解决方案2】:
  1. 看来您应该调用 myClass.newInstance() 而不是 deleteClass.newInstance()
  2. 确保 clearApplicationUserData() 方法知道处理 IPackageDataObserver 的空值。

希望对你有帮助。

【讨论】:

    【解决方案3】:

    deleteClass 是什么?您不应该尝试在myClass 上调用您的方法吗?

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-10-12
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多