DeadObjectException
和NullPointerException
有什么区别?
我认为我可能理解了,但我只是想确认一下。
我的理解
当你试图引用某个东西(而内存仍然存在),但没有任何指针持有其地址,因此无法访问该内存时,会发生DeadObjectException
。它与NullPointerException
不同之处在于,内存仍然有效,只是无法访问它。
我是否有正确的想法?根据网站上其他问题:
我认为我的断言是正确的,我只是想确认一下。
DeadObjectException
和NullPointerException
有什么区别?
我认为我可能理解了,但我只是想确认一下。
我的理解
当你试图引用某个东西(而内存仍然存在),但没有任何指针持有其地址,因此无法访问该内存时,会发生DeadObjectException
。它与NullPointerException
不同之处在于,内存仍然有效,只是无法访问它。
我是否有正确的想法?根据网站上其他问题:
我认为我的断言是正确的,我只是想确认一下。
NullPointerException是指当一个引用在同一个Java虚拟机中未指向任何对象时的情况。
DeadObjectException是指当你调用一个不再存在的远程对象时发生的情况。这种情况发生在两个不同的JVM上。
NullPointerException - 当程序试图访问对象的字段或方法,或数组的元素时,如果没有对象或数组实例可用,则会抛出此异常。
android.os.DeadObjectException - 来自developer.android.com:由于它扩展了RemoteException,因此您调用的对象已死亡,因为其托管进程不再存在。
例如:复制:)这是一个很好的例子,可以很好地理解它。
您有MyActivity和MyService类。您使用Handler/Messenger在它们之间进行通信。您在MyActivity中创建Handler和Messenger,然后通过Intent将创建的Messenger实例发送到MyService。然后,您做一些事情,时间过去了,您的MyActivity被销毁,连同它的Handler和Messenger一起被销毁。现在,如果您处理得不好,MyService将不知道他拥有的Messenger不再有效,因此,他尝试通过它发送一些内容,并获得DeadObjectexception:
/*向此Messenger的Handler发送消息。
参数: message要发送的消息。通常通过Message.obtain()检索。 抛出: RemoteException如果目标Handler不再存在,则引发DeadObjectException。*/
public void send(Message message) throws RemoteException {...}
IBinder
)是一个与另一个进程中的对象绑定在一起的对象。
当您调用其上的方法时,它充当该其他对象的代理。 (您不是直接调用其上的方法,而是要求该代理为您传输您的意图并检索结果。)
当远程对象断开连接时,代理无法再访问该对象,但代理对象仍然存在于本地。
您持有的实例仍然存在(因此不会出现NPE。只要您引用了该实例,它就不会消失。无法保留引用并看到实例消失(某些对象将允许类似的行为,例如WeakReference),因此您永远不可能获得NPE)。
但是,它指的是不再存在的东西。 原则上类似于NPE,但更高级(并且与android OS和它处理进程间通信的方式纠缠在一起)。
NPE是当您执行以下操作时发生的情况
MyObject foo = null;
foo.something();
foo
不是一个对象,它是一个空引用。
MyObject foo = null; foo.something();
时发生的情况,foo不是一个对象,而是一个空引用。 - njzk2