【问题标题】:Difference between DeadObjectException and causing a NullPointerExceptionDeadObjectException 和导致 NullPointerException 之间的区别
【发布时间】:2015-08-21 16:59:02
【问题描述】:

DeadObjectExceptionNullPointerException 有什么区别? 我想我可以理解,但我只是想确定一下。


我的理解

DeadObjectException 发生在您尝试引用某物(并且内存仍然存在)但没有任何指针保存其地址时,因此无法访问该内存。它与NullPointerException 的不同之处在于内存仍然有效,只是无法访问它。


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

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

【问题讨论】:

  • 远程对象是与另一个进程中的对象绑定的对象。当您在其上调用方法时,它充当该其他对象的代理。当远程对象断开连接时,该对象不再可访问。您持有的实例仍然存在(因此,不是 NPE),但它指的是不再存在的东西。原则上类似于 NPE,但更高级别(并且纠缠在 android OS 中)。 NPE 是当您执行 MyObject foo = null; foo.something(); foo is not an object it is an null reference 时会发生的情况。
  • 所以(简单地说)我持有一个持有实际对象的中间人对象。当中间人失去他的参考时,那是我得到 DOE 的时候,因为他不知道在什么上执行命令?
  • @njzk2 我对您的评论的解释正确吗?
  • @njzk2 耶!你想把它作为答案让我接受吗?

标签: java android


【解决方案1】:

NullPointerException 是指引用未指向同一 Java 虚拟机中的任何对象

DeadObjectException 是当您调用一个不再存在的 remote 对象时。这发生在 2 个不同的 JVM 上。

【讨论】:

    【解决方案2】:

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

    【讨论】:

      【解决方案3】:

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

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

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

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

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

      NPE 就是当你这样做时会发生什么

      MyObject foo = null;
      foo.something();
      

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2016-06-14
        • 2018-03-11
        • 2021-12-25
        • 2020-05-10
        • 2014-09-20
        • 2010-10-28
        • 2015-10-04
        相关资源
        最近更新 更多