Throws und throw....

ar3z

Mitglied
Hi!
Ich habe ein kleines Problem....und zwar habe zwei Funktionen, ruft die eine die andere auf, soll bei auftreten eines Fehlers dieser an die aufrufende weitergegeben werden, und diese soll ihn "ignorieren"

Im Code sieht das ca. so aus:

Funktion1:

Java:
public void fkt1 {
try{
fkt2(3);
}
catch(Exception e){
e.printStackTrace();
}

Funktion2

Java:
public string fkt2 (int x) throws RuntimeException{
if(x=1) return bla;
if(x=2) return blubb;
else {
throw new RuntimeException("bla");
}
}

Das hier ist natürlich nicht der richtige Code, zeigt aber die Struktur....nun ist es aber so, dass die Exception in fkt2 nicht an fkt1 weitergegebn wird und dort angezeigt wird, aber das Programm nicht stoppt, sondern sie wird einfach in fkt2 ausgeführt und stoppt alles....

Danke schonmal für eure Hilfe 🙂
 
Entschuldige: Ich habe den Text oben jetzt vier mal gelesen und verstehe ihn noch immer nicht. Versuch's mal bitte in kurzen Sätzen zu erklären. Was willst Du erreichen? Was hast Du erwartet? Was passiert statt dessen?

Ebenius
 
naja es ist recht einfach ein paar worte zu entfernen, es aus dem Kontext zu reissen und dann zu behaupten es gäbe keinen Sinn...^^
aber ich gebe zu es sind sehr stark verschachtelte Sätze, die evtl erst nach ein paar Mal durchlesen Sinn geben.

Also:
Ich will erreichen:
-tritt in fkt2 die Exception auf (beim else) soll diese an fkt1 übergeben werden. Dort soll sie per .printstacktrace ausgegeben werden, ohne das komplette Programm zu stoppen. Das bewirkt .printstacktrace ja meines wissens.

Es passiert aber:
die Exception wird einfach in fkt2 abgehandelt und das Programm bricht an dieser Stelle ab. Obwohl ich eigtl. doch per "throws...." angebe, dass die Exception an die aufrufende Funktion übergeben wird...

Danke für eure Hilfe!!!
 
Ohje. Jetzt weiß ich, warum ich Dich nicht verstehe.

Also
  1. [c]throws[/c] hat überhaupt nichts mit dem Exception-Fluss zu tun. Genau genommen ist es in Deinem Beispiel vollkommen nutzlos. Es gibt in Java zwei Sorten von Ausnahmen.
    • RuntimeException und Errors (bzw. deren Derivate). Diese Ausnahmen sind sogenannte ungeprüfte Ausnahmen (unchecked exceptions). Diese Ausnahmen können aus jeder Methode (od. Konstruktor) geworfen werden.
    • Alle anderen Ausnahmen: Die können nur dann aus einer Methode (od. einem Konstruktor) geworfen werden, wenn sie per [c]throws[/c] deklariert sind. Dafür sorgt der Compiler per Compile-Error, wenn ein [c]throws[/c]-Konstrukt zu irgendeiner checked Exception fehlt.
    Das hat mit Deinem Problem nichts zu tun, denn Deine Funktion 2 wirft eine unchecked Exception; [c]throws[/c] ist also wirkungslos.
    Ich will erreichen:
    -tritt in fkt2 die Exception auf (beim else) soll diese an fkt1 übergeben werden. Dort soll sie per .printstacktrace ausgegeben werden, ohne das komplette Programm zu stoppen.
    Genau das passiert auch.
  2. Deine Erklärung haut einfach nicht hin. In jedem Fall fällt die Exception (sofern die [c]throw new…[/c]-Zeile ausgeführt wird) an die aufrufende Funktion geworfen. Und in jedem Fall wird die in Funktion 2 geworfene RuntimeException in Funktion 1 abgefangen und behandelt. Du unterliegst also einem Beobachtungsfehler oder hast Dein Programm falsch erklärt; ich tippe auf ersteres.
  3. Deine Nomenklatur ist schwer zu verstehen. Exceptions werden nicht ausgeführt. Sie werden geworfen. [c]printStackTrace()[/c] hat nichts damit zu tun, dass die Exception das Programm nicht stoppt; das [c]catch[/c] fängt die Exception ab, egal, ob deren StackTrace ausgedruckt wird oder nicht.

Nicht ärgern, das wird schon noch. Aber ich bin gespannt, wo Dein eigentliches Problem liegt.

Ebenius
 
Zuletzt bearbeitet:
@Ebenius, @TO:
Gehen wir von folgendem Programm aus:
Java:
try {
    a();
    b();
    c();
} catch (FooException fooEx) {
    // ...
}
Wenn nun [c]b()[/c] eine Exception schmeisst, dann wird nicht das ganze Programm gestoppt, sondern der Try-Block beendet. D.h. dass das Programm durchaus weitergefürt wird, allerdings [c]c()[/c] nie aufgerufen wird. [c]a()[/c] wurde natürlich bereits normal aufgerufen. @TO: meinst du das?
 

Zurück
Oben