Was ist der Unterschied zwischen DeadObjectException
und a NullPointerException
?
Ich denke, ich mag es verstehen, aber ich wollte nur sichergehen.
Mein Verständnis
Ein DeadObjectException
passiert, wenn Sie versuchen, einen Verweis auf etwas (und der Speicher existiert noch, aber es gibt keine Zeiger, die seine Adresse halten, also gibt es keine Möglichkeit, diesen Speicher zu erreichen. Es unterscheidet sich von einem NullPointerException
in der Tatsache, dass der Speicher immer noch gültig ist, es gibt einfach keine Möglichkeit, ihn zu erreichen.
Habe ich die richtige Idee? Basierend auf anderen Fragen auf der Website:
Ich denke meine Behauptung ist richtig, ich wollte nur sicher gehen.
Ein entferntes Objekt (z. B. IBinder
) ist ein Objekt, das an ein Objekt gebunden ist, das sich in einem anderen Prozess befinden kann.
Wenn Sie Methoden aufrufen, fungiert es als Proxy für dieses andere Objekt. (Anstatt dass Sie direkt Methoden aufrufen, bitten Sie diesen Proxy, Ihre Absicht zu übermitteln und das Ergebnis für Sie abzurufen.).
Wenn das Remote-Objekt getrennt wird, kann der Proxy das Objekt nicht mehr erreichen, aber das Proxy-Objekt ist immer noch lokal vorhanden.
Die Instanz, die Sie behalten, existiert immer noch (also keine NPE. Solange Sie einen Verweis auf die Instanz haben, kann sie nicht verschwinden. Es ist unmöglich, eine Referenz zu halten und die Instanz verschwinden zu lassen (einige Objekte erlauben es) ähnliches Verhalten, wie WeakReference), so dass Sie niemals NPE) bekommen könnten.
Es bezieht sich jedoch auf etwas, das nicht mehr ist. Im Prinzip ähnelt die NPE, ist aber viel höher (und verwickelt in android OS und die Art, wie es die Kommunikation zwischen den Prozessen behandelt).
NPE ist was passiert, wenn Sie
tun %Vor% foo
ist kein Objekt, es ist eine Nullreferenz.
NullPointerException - Dies wird ausgelöst, wenn ein Programm versucht, auf ein Feld oder eine Methode eines Objekts oder eines Elements eines Arrays zuzugreifen, wenn keine Instanz eines Objekts oder Arrays vorhanden ist. android.os.DeadObjectException - Von developer.android.com: Wie es RemoteException erweitert Das Objekt, das Sie anrufen, ist gestorben, weil sein Hosting-Prozess nicht mehr existiert.
Zum Beispiel: kopiert :) sein schönes Beispiel um es gut zu verstehen.
Sie haben MyActivity- und MyService-Klassen. Sie verwenden Handler / Messenger, um zwischen ihnen zu kommunizieren. Sie erstellen Handler und Messenger in MyActivity und senden dann die erstellte Instanz von Messenger per Absicht an MyService. Dann tust du etwas, vergeht die Zeit und deine MyActivity wird zerstört, zusammen mit Handler und Messenger. Nun, wenn Sie damit nicht gut umgehen, wird MyService nicht wissen, dass der Messenger, den er hat, nicht mehr gültig ist, also versucht er, etwas durch ihn zu schicken und DeadObjectexception zu erhalten:
/ * Sende eine Nachricht an den Handler dieses Botschafters.
Parameter: Nachricht Die Nachricht, die gesendet werden soll. Wird normalerweise über Message.obtain () abgerufen. Wirft: RemoteException löst DeadObjectException aus, wenn der Zielhandler nicht mehr existiert. * /
public void send (Nachricht Nachricht) löst RemoteException {...}
aus