DeadObjectException和NullPointerException之间的区别

8

DeadObjectExceptionNullPointerException有什么区别? 我认为我可能理解了,但我只是想确认一下。


我的理解

当你试图引用某个东西(而内存仍然存在),但没有任何指针持有其地址,因此无法访问该内存时,会发生DeadObjectException。它与NullPointerException不同之处在于,内存仍然有效,只是无法访问它。


我是否有正确的想法?根据网站上其他问题:

我认为我的断言是正确的,我只是想确认一下。


远程对象是绑定到另一个进程中的对象的对象。当您调用其上的方法时,它充当该其他对象的代理。当远程对象断开连接时,该对象将不再可达。您所持有的实例仍然存在(因此不是NPE),但它引用的是不再存在的东西。原则上类似于NPE,但更高级(并且与Android OS纠缠在一起)。NPE是当您执行MyObject foo = null; foo.something();时发生的情况,foo不是一个对象,而是一个空引用。 - njzk2
所以(简单来说),我持有一个中间对象,该对象持有实际对象。当中间人失去引用时,我会得到DOE,因为他不知道在哪个对象上执行命令? - Jeeter
@njzk2,我的理解是正确的吗? - Jeeter
@njzk2 好的!你想把它作为答案,这样我就可以接受它了吗? - Jeeter
3个回答

1

NullPointerException是指当一个引用在同一个Java虚拟机中未指向任何对象时的情况。

DeadObjectException是指当你调用一个不再存在的远程对象时发生的情况。这种情况发生在两个不同的JVM上。


0

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 {...}


-2
一个远程对象(例如IBinder)是一个与另一个进程中的对象绑定在一起的对象。

当您调用其上的方法时,它充当该其他对象的代理。 (您不是直接调用其上的方法,而是要求该代理为您传输您的意图并检索结果。)

当远程对象断开连接时,代理无法再访问该对象,但代理对象仍然存在于本地。

您持有的实例仍然存在(因此不会出现NPE。只要您引用了该实例,它就不会消失。无法保留引用并看到实例消失(某些对象将允许类似的行为,例如WeakReference),因此您永远不可能获得NPE)。

但是,它指的是不再存在的东西。 原则上类似于NPE,但更高级(并且与android OS和它处理进程间通信的方式纠缠在一起)。

NPE是当您执行以下操作时发生的情况

MyObject foo = null;
foo.something();

foo 不是一个对象,它是一个空引用。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接