关于使用AIDL出现空指针的解决办法

使用AIDL进行远程调用的时候出现的空指针异常,解决过程稍微有点小曲折。具体安下

1.先贴异常信息

1 ERROR/AndroidRuntime(9435): FATAL EXCEPTION: main
2 ERROR/AndroidRuntime(9435): java.lang.NullPointerException
3 ERROR/AndroidRuntime(9435): at android.os.Parcel.readException(Parcel.java:1328)
4 ERROR/AndroidRuntime(9435): at android.os.Parcel.readException(Parcel.java:1276)

2.解析原因:看调用栈显示的是android.os.Parcel.readException位置出现了空指针异常,但是这是源代码啊,这里怎么会出空指针异常呢。好吧,要本看源码了:

 1 public final void readException(int code, String msg) {
 2         switch (code) {
 3             case EX_SECURITY:
 4                 throw new SecurityException(msg);
 5             case EX_BAD_PARCELABLE:
 6                 throw new BadParcelableException(msg);
 7             case EX_ILLEGAL_ARGUMENT:
 8                 throw new IllegalArgumentException(msg);
 9             case EX_NULL_POINTER:
10                 throw new NullPointerException(msg);
11             case EX_ILLEGAL_STATE:
12                 throw new IllegalStateException(msg);
13         }
14         throw new RuntimeException("Unknown exception code: " + code
15                 + " msg " + msg);
16     }

上面是出错的位置的代码。傻眼了,原来不是哪里有引用了空对象,而是它抛出了一个空指针异常。这是什么情况呢?

3.接着分析原因:追查readException方法调用的地方

 1 @Override public java.lang.String doOperation() throws android.os.RemoteException
 2 {
 3 android.os.Parcel _data = android.os.Parcel.obtain();
 4 android.os.Parcel _reply = android.os.Parcel.obtain();
 5 java.lang.String _result;
 6 try {
 7 _data.writeInterfaceToken(DESCRIPTOR);
 8 mRemote.transact(Stub.TRANSACTION_getMaxCpuFreq, _data, _reply, 0);
 9 _reply.readException();
10 _result = _reply.readString();
11 }
12 finally {
13 _reply.recycle();
14 _data.recycle();
15 }
16 return _result;
17 }

关键代码是_reply.readException(); _reply为mRemote.transact()方法执行后的返回数据对象,即_reply为远程接口返回的数据封装对象。但是通过log查看,远程接口方法并没有执行完成啊,并没有返回数据啊,那怎么会有返回数据呢,而且返回通过返回数据对象抛出了空指针异常?

4.继续分析原因:由上可知远程方法并没有执行完成,但是transact方法却执行完成了,并且通过返回数据对象抛出了空指针,说明远程接口的api里面的实现是有问题的,它的问题导致了远程方法没有执行完成,直接返回。但是现在问题又来了,由于没有错误日志,没有调用栈信息,如果快速知道远程接口哪里代码出问题了呢。正在困惑的时候看到了国外的网站上给出了解决办法:

在远程实现接口的时候,实现onTransact方法,然后在里面捕获异常,并打印出调用栈的信息:

1 protected boolean onTransact(int code, Parcel data, Parcel reply, int flags) {
2     try {
3         super.onTransact(code, data, reply, flags);
4     } catch (RuntimeException e) {
5         Log.w("MyClass", "Unexpected remote exception", e);
6         throw e;
7     }
8 }

原来是出现的exception是远端api实现中抛出来的,然后直接返回,将异常结果抛给了调用远端程序的客户端,原来如此。然后借助上面的调试代码打出的堆栈信息,直接定位,解决问题。

时间: 2024-07-28 15:25:33

关于使用AIDL出现空指针的解决办法的相关文章

Android错误之setAdapter(adapter)空指针nullPointer 解决办法

在设置adapter时,会经常遇到如下错误: 空指针错误 如果setAdapter报空指针,那么可用如下语句调试,找出到底哪里产生空指针 hisList = (ListView) findViewById(R.id.oillist);                if(hisList==null)                {                        Log.d("debug","hislist null");             

spring boot继承web和mybatis时,调用接口删除记录出现的空指针以及解决办法

前两天在学spring boot的时候,出现了一个很奇怪的错误,因为是第一次使用spring boot,所以没想到会遇到这种莫名其妙的bug,即调用接口删除数据库中一条记录的时候,数据库中记录事实上以及被删除了,但是却返回一个null,这就令我百思不得其解了,理论上,删除的话,会返回受影响的记录的条数. 最后排查了一圈,结果却十分令我大跌眼镜,真的很简单!下面写的代码: controller类,这里由于后来数据库sql改了,为了测试like的搜索功能,所以前面的index方法参数并未进行及时修改

手动new对象出现空指针的解决办法详解

java.lang.NullPointerException at com.example.new_oa.identity.service.impl.IdentityServiceImpl.getAllDepts(IdentityServiceImpl.java:51) at com.example.new_oa.NewOaApplicationTests.initDb(NewOaApplicationTests.java:31) at sun.reflect.NativeMethodAcces

3 学习笔记之java学习遇到的问题以及解决办法

1.在程序中,会遇到    控制台提示:Exception in thread "AWT-EventQueue-0" java.lang.NullPointerException------ 问题的原因:主要是由于java中的对象并没有实例化,导致java中提示  为空指针. 解决办法:例如:listpanel   listpanel= new listpanel();

Android 在 Fragment 中使用 getActivity() NullPointException 的思考和解决办法

问题: 使用 AS 在 Fragment 中调用 getActivity() 方法的时候会出现可能为空指针的提醒 使用 monkey 多次十万次测试,会出现 getActivity() NullPointException 的情况 思考 为什么会出现这种情况,按说当前 Activity 存在,在 Fragment 中使用 getActivity() 是可以拿到的,不应该为空的 源码 fragment 的生命周期 以下源码基于 API 26 getActivity 可能为 Null, 跟进源码,可

使用Android studio创建的AIDL编译时找不到自定义类的解决办法

使用AS创建ADIL文件时AS会在main文件夹下给我们生成一个aidl文件夹和一个相同包名的包,通常我们会把所有和ADIL相关的类或文件放在这个包下,但是如果存在自定义的类时,程序编译时无法通过,提示找不到自定义的包.解决办法如下,在启动Module的build.gradle中加入如下代码: sourceSets { main { manifest.srcFile 'src/main/AndroidManifest.xml' java.srcDirs = ['src/main/java', '

“Execution failed for task ‘:app:compileDebugAidl': aidl is missing”解决办法

转载: “Execution failed for task ‘:app:compileDebugAidl': aidl is missing”解决办法 今天重建android studio编程环境,老编译不过,提示:Execution failed for task ‘:app:compileDebugAidl': aidl is missing,在网上查了不少资料,终于在一个国外网站找到了解决办法: In my case I downloaded version 22 of Android

Activity被回收导致fragment的getActivity为null的解决办法

这两天一直被这个问题困扰,假如app长时间在后台运行,再点击进入会crash,而且fragment页面有重叠现象,让我十分不爽.研究了一天,终于明白其中的原理并加以解决.解决办法如下: 如果系统内存不足.或者切换横竖屏.或者app长时间在后台运行,Activity都可能会被系统回收,然后Fragment并不会随着Activity的回收而被回收,从而导致,Fragment丢失对应的Activity. 这里,假设我们继承于FragmentActivity的类为MainActivity,其中用到的Fr

Spring MVC普通类或工具类中调用service报空空指针的解决办法(调用service报java.lang.NullPointerException)

当我们在非Controller类中应用service的方法是会报空指针,如图: 这是因为Spring MVC普通类或工具类中调用service报空null的解决办法(调用service报java.lang.NullPointerException) 按上述步骤解决完自己的工具类后,你会发现项目运行后仍然报空指针此时你需要在applicationContext.xml 配置文件中添加一行配置文件 如图: 对自己工具类所在的包进行注解扫描,使Spring能够识别自己上面所配置的注解 原文地址:htt