On Sat, 27 Dec 2003 at 14:10 (+0100), Andre Heine wrote:
Am Saturday 27 December 2003 13:42 schrieb Bernhard Walle:
[...]
Danke für deine Hilfe, aber das langt nicht. Es geht nicht um kleine Vertipper oder "Teilen durch 0", die ich abfangen muß,
Ich weiss leider nicht genau, wie sich da Perl verhält. Aber in C/C++ oder Java kann man mit "try/catch" genau solche Sachen machen :)
Einen Speicherzugriffsfehler abfangen? Wie?
Was ist den mit der berüchtigten "NullpointerException" in Java? Wird da nicht auf ein "nicht initialisiertes Objekt" zugegriffen?
Also greift da Java z.B. auf Speicher zu, der nicht initialisiert ist (oder noch nicht).
Du kannst eine Nullpointer-Exception in Java nicht mit einem Speicherzugriffsfehler in C/C++ vergleichen. Auf uninitialisierte Objekte kann man in Java nicht zugreifen, da sowas bereits der Compiler überprüft. Bsp.: // j hat irgendeinen Wert int i; if (j > 5) { i = 10; } System.out.println(i); // wird vom Compiler abgelehnt da potentiell // uninitialisiert Ein Nullzeiger ist kein uninitialisiertes Objekt. Es exisitert überhaupt kein Objekt, die Referenzvariable hat schlicht den Wert null wie in C++ ein Zeiger den Wert 0 (NULL) haben kann. Wenn Du in Java nativen Code hast gibt es auch hier das Problem eines Speicherzugriffsfehler. Die VM befindet sich dann in einem nicht definierten Status und das Programm sollte beendet werden. In C++ greift man auf einen Speicherbereich zu, der vom Betriebssystem einem anderen Prozess zugeordnet wurde. Dies wird dann vom Betriebs- system mit einem SIGSEGV abgelehnt. Das Programm befindet sich dadurch in einem potentiell undefinierten Zustand, kann noch Aufräumarbeiten durchführen und hat sich dann zu beenden. Standardmäßig beendet es sich umgehend. Eine Ausnahme wird da an keiner Stelle geworfen. Gruß, Bernhard -- "Ich dachte immer, UNIX ist was für Leute, denen es gefällt, auf einen Bildschirm zu starren, auf dem es aussieht, als hätte sich gerade ein Gürteltier auf der Tastatur gewälzt." -- Stefan Schneider