Frage

Ein möglicher Grund, weil eine Nullpointer ist eine Laufzeitausnahme ist, weil jede Methode es werfen, so dass jedes Verfahren eine haben, müßte „wirft Nullpointer“, und würde hässlich. Aber dies geschieht mit Remote.

Und ein möglicher Grund, weil Remote keine Laufzeitausnahme ist, ist ihm Kunden zu sagen, um die Ausnahme zu behandeln. Aber jede Methode in einer Remote-Umgebung notwendig wirft es, so gibt es keinen Unterschied Nullpointer werfen.

Speculations? War mir klar?

War es hilfreich?

Lösung

Ich werde die Entscheidung nicht diskutieren, ich werde nur die Erklärung der Entscheidung von Ann Wollrath zitieren (die das Design und die Implementierung von Java RMI führen). Dies wird von dieser Nachricht extrahiert von den RMI-NUTZER Archiven (Meldung vom Januar 1999):

Die Entscheidung, eine Remote zu machen geprüfte Ausnahme und erfordern Fern Methoden, die Ausnahme zur Liste in seinem throws-Klausel ist nicht eine religiöse. Die Entscheidung basiert auf, wie man Berechnen zuverlässig verteilt. Dies Frage kommt jeder einmal in einem nach oben während des Besuchs unserer Benutzerliste. Ich habe ein ausführliche Antwort, dass ich eine gepostete Vor einiger Zeit. Hier ist es, wenn Sie interessiert. Ich konnte es nicht in die finden rmi-Benutzer archivieren, so dass ich es inbegriffen unten.

prost,

- Ann


Ich möchte die Gründe zur Adresse für Herstellung Remote eine gesichtete Ausnahme, eher als eine Runtime.

1) Netzwerke sind nicht zuverlässig

Ich wünsche, dass sie waren, aber in der Tat, Sie sind nicht. Jedes Netzwerk hat transiente Ausfälle. Sie können bauen in Netzwerk-Redundanz, aber die Tatsache ist, dass die meisten Netzwerke haben das nicht. Intranets haben vorübergehende Fehler, wie funktioniert das Internet. So machte jeder RPC, ist zu einem Ausfall unterliegt. Die Arten von Defekt kann nichts zu tun mit dem "Netzwerk", per se; wenn dein Server läuft aus Filedeskriptoren, Ihr Kunde bekommt eine Verbindungs Ausnahme. Dies ist kein Netzwerk Versagen im Sinne des Netzes gebrochen; Ihr Server in einem Übergangszustand der Ressource zu sein ausgehungert.

ist RMI nicht entwickelt, um nur den Griff begrenzt Fall, dass das gesamte Netzwerk stürzt ab, wenn eine einzelne Maschine abstürzt. Ein solches Netzwerk würde als zuverlässig, entweder alles oder alles ist nach unten - es gibt keine Teilausfall. RMI ist targetted für Eine allgemeinere Publikum.

2) RPC-Fehler kann nicht von versteckt werden der Client

Teilversagen ist eine Tatsache verteilte Programmierung; diese Ausfälle können nicht auf die ausgeblendet werden Programm. Ein Fehler zeigt sich in der Client, ob die Ausnahme es aktiviert oder deaktiviert Ausnahme, noch auftaucht. Also, wie sollte eine solche Ausfälle an den Client angezeigt werden?

3) überprüft Ausnahmen Pflege mehr robustere Programme

Es gab eine Zeit, als Eiche und die früheste Version von Java nicht haben geprüfte Ausnahmen. Ausnahmebehandlung Beratungs war, und es war ein unsicheres Welt da draußen. Es war unsere Gruppe (Jim Waldo und mich insbesondere :-) dass empfohlen, dass es Ausnahmen geben vom Compiler geprüft. Jim war recht in seinen Argumenten überzeugend, zu sagen einer Welt, in der robusten Code würde Herrschaft. Nach einiger Überlegung, Java haben geprüft umrüsten Ausnahmen. Nur die Ausnahmen für die es keine Erholung oder reflektieren Anwendungsfehler wäre unkontrolliert (Z.B. OutOfMemoryError, Nullpointer respectively). Und die Welt war wieder sicher.

Stellen Sie sich vor Überraschung der Java-Ingenieure wenn viele Ausnahmen in dem Java-API und Compiler wurden geändert von ungeprüft geprüft, und der Compiler die Unterscheidung durchgesetzt, sie ungedeckte Bugs in den Implementierungen! Also, die besten Bemühungen im Umgang mit Fehlern Bedingungen, aber gut gemeinten, war nicht gut genug. Das Compiler nützlich für etwas: -)

4) Remote a geprüft werden soll Ausnahme

Ok, also wieder hier verfolgen. Seit einem Remote ist eine Tatsache des Lebens in einem RPC-Aufruf (siehe # 1, # 2) und überprüfte Ausnahmen zwingen SieSchreib sicher Code (# 3), dachten wir, dass die Herstellung Remote eine geprüfte Ausnahme war eine gute Idee. Schreiben robust verteilte Programme ist hart genug, ohne den Compiler zu Hilfe, die Sie mit Ausnahmen.

So argumentieren einige vielleicht, dass ein Remote ist wie ein Außerhalb des Speicherfehler; Ihr Programm sollte umfallen tot, wenn ein Remote-Aufruf fehlschlägt. Ich bin nicht einverstanden mit diesem Punkt. Ja in In einigen Fällen gibt es keine Erholung von eine Remote; aber wenn Sie Schreiben Sie eine zuverlässige verteilt Programm, Ihr Kunde muss Fang Ausfälle und Wiederholungs angemessen. Vielleicht brauchen Sie eine andere kontaktieren Server oder Abbruch einer Transaktion von einigen Sortieren. Wenn die Remote nicht behandelt, wird es versickern und Absturz Ihres Client (igitt).

Andere haben festgestellt, dass es einige Remote-Schnittstellen, die verwendet werden in sowohl der lokale Fall und die Fernbedienung Fall und der Kunde sollte nicht haben, befassen sich mit den Ausnahmen in der lokalen Fall, so sollte nicht Remote sein müssen in einer throws-Klausel und Handhabung sollte nicht obligatorisch sein. Wenn wir nun erlaubt Remote-Schnittstelle Verfahren wegzulassen und Remote ein „rmic“ -Schalter musste Stubs erzeugen das würde einen ungeprüften werfen Remote, die Client hat nicht Wahl in der Angelegenheit. Die Entscheidung des Ausnahmebehandlung sollte bleiben der Kunde. Wenn Sie definieren eine Schnittstelle dass wirft nur unkontrolliert Ausnahmen Sie können nie einen Client schreiben, will Compiler Hilfe im Umgang mit diese Ausnahmen. Wir haben schon aus dem obigen Beispiel ersichtlich, dass geprüfte Ausnahmen Fosters robust Code.

Ein weiteres Problem, das jetzt wieder auftauchte und wieder ist, dass Entwickler müssen einfach lokale Schnittstellen übersetzen und sie als Remote-Schnittstellen. Dies kann für eine kleine Gruppe von Fällen funktionieren, aber wenn die Schnittstelle wurde nicht entwickelt, um mit Parallelität und teilweisen Ausfall und rufen Latenz im Auge, das Protokoll durch die Grenzfläche eingefangen möglicherweise nicht falls in verteilten verwenden Fall. Ist genügend Informationen übergeben diese Vorgänge machen die Operationen idempotent? Vielleicht, aber höchstwahrscheinlich nicht.

Putting Remote in jedem throws-Klausel wie ein Schmerz zu sein scheint, aber es ist der Preis für das Schreiben zu zahlen robust verteilten Anwendungen.

- Ann Wollrath

Andere Tipps

Es gibt wesentlich mehr Potenzial für NullPointerException als RemoteException. Jeder Code, der eine Methode für ein Objekt aufruft (dh praktisch alle Java-Code überhaupt) könnte möglicherweise eine NullPointerException werfen. Es kann nur RMI Code ein RemoteException werfen. Dies ist eine kleine Teilmenge von "all-Code."

Wenn Sie die RMI-Bibliotheken schreiben, entschieden sich die Designer der Client-Code zu machen erwarten mit diesen Ausnahmen zu behandeln. In Anbetracht der Art der Remotecodeausführung, ich glaube, das ist vernünftig.

So wie ich es verstehe, ist:

  • Runtime werden für Dinge geworfen, die vermeidbar waren.
  • Ausnahmen sind für Dinge geworfen, die waren unpreventable aber wiederherstellbare
  • Fehler werden für Dinge geworfen, die unabwendbare und nicht wiederherstellbar sind.

Zum Beispiel kann Nullpointerexceptions immer vermieden werden und sind daher nicht markiert Ausnahmen. Ein Remote könnte auftreten, wenn ein Netzwerkfehler ist, die sich nicht hinreichend vor dem Methodenaufruf verhindert werden kann und daher überprüft wird.

Neben RemoteException nur Code aus java.rmi und javax.rmi Paketen der Anwendung (und dessen Subpackages), RemoteException ist eine Art von IOException, ähnlich wie SocketException ist ... und all IOExceptions geprüft Ausnahmen.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top