exceptions beenden doch nicht alles...

Benutzeravatar
aDramaQueen
Mausschubser
Mausschubser
Beiträge: 84
Registriert: 10. Jan 2014 16:34

exceptions beenden doch nicht alles...

Beitrag von aDramaQueen »

entgegen der aktuellen lage, schraube ich grad ein bissel am controller rum. dabei ist ne grundsatzfrage aufgekommen:

ich dachte, WENN mal ne exception geworfen wird, wird alles was nach dieser exception steht NICHT mehr ausgeführt...

nun frag ich beim controller mittels switch/case die tasten ab. dementsprechend werden in manchen fällen eben jene exceptions geworfen. nun hat sich beim testen aber rausgestellt, dass dies NICHT zum abbruch
der switch/case-abfrage führt. wenn ich beim letzten argument von switch/case lande, also beim default, dann will er sogar noch nach der exception die ich dann werfe ein return-statement haben! nun stell ich mir eben
die frage warum...?

Ach ja, ein frage noch zu den exceptions: der text den wir bei manchen eingeben, der wird aber nicht angezeigt oder? sollen wir den dann ins return-statement schreiben?
Bild
...Never go full retard...

Benutzeravatar
SophiaLi1
Kernelcompilierer
Kernelcompilierer
Beiträge: 542
Registriert: 5. Jan 2014 11:48

Re: exceptions beenden doch nicht alles...

Beitrag von SophiaLi1 »

Klar will er ein return-Statement haben, es kann ja auch der Fall sein, dass die Exception nicht geworfen wird. Und wenn die Methode einen Rückgabewert hat, dann braucht sie auch ein return-Statement.

Benutzeravatar
aDramaQueen
Mausschubser
Mausschubser
Beiträge: 84
Registriert: 10. Jan 2014 16:34

Re: exceptions beenden doch nicht alles...

Beitrag von aDramaQueen »

das er was zurück haben will is ja klar, aber ich erstelle dann doch explizit eine exception für diesen fall. bsp:

public String methodeX(int key) throws InvalidPositionException{
........
default:
new InvalidPositionException("There's no way to do that here...");
return "Try another one...";
}
}

falls nun in der methode ne andere taste als eine der oben definierten gedrückt wird, soll er mir explizit eben die diese InvalidPositionException werfen...
Bild
...Never go full retard...

Benutzeravatar
SophiaLi1
Kernelcompilierer
Kernelcompilierer
Beiträge: 542
Registriert: 5. Jan 2014 11:48

Re: exceptions beenden doch nicht alles...

Beitrag von SophiaLi1 »

Du brauchst für jeden case-Zweig ein return-Statement, hast du das schon? Eine Exception zählt für das Programm nicht als Rückgabewert, return ist immer nötig, außer wenn der Rückgabewert leer ("void") ist.

Benutzeravatar
aDramaQueen
Mausschubser
Mausschubser
Beiträge: 84
Registriert: 10. Jan 2014 16:34

Re: exceptions beenden doch nicht alles...

Beitrag von aDramaQueen »

Ja na klar, aber darum gehts mir grad garned. die frage die ich mir gerade stelle, warum das programm nach dieser exception einfach weiter macht? ich hab gelernt, das ne exception zwar durchaus weiter geleitet werden kann, innerhalb der methode/klasse in der sie aber geworfen wurde, direkt zu nem abbruch aller folgenden befehle fürht. zumindest wenn sie nicht gleich vor ort behandelt wird. somit sollte ja auch diese string-rückgabe nicht mehr gefordert werden....?!?
Bild
...Never go full retard...

Gast
Gast

Re: exceptions beenden doch nicht alles...

Beitrag von Gast »

du musst glaub ich noch etwas geanuer werden...

nur so am rande:

Code: Alles auswählen

switch(bla){
        case 1: 
                if (irgendwas){
                        do irgendwas;
                        break;  // notwendig sonst wird im nächsten case weitergemacht bzw. hier die exception geworfen. ein return an der Stelle würde methode sofort beenden.
                }
                throw new exceptionXY(); // beendet methode
        case 1:
                etc... 
}


steffen12
Sonntagsinformatiker
Sonntagsinformatiker
Beiträge: 205
Registriert: 14. Okt 2009 16:28

Re: exceptions beenden doch nicht alles...

Beitrag von steffen12 »

Doch, tun sie. Der Hintergrund des obigen Kompilierfehlers ist folgender:

Für Computerprogramme als Ausdrücke einer Sprache unterscheidet man zwei Arten von Korrektheit:

1) Semantische Korrektheit:
Bedeutet grob ausgedrückt, der Code führt zur Laufzeit aus logisch zwingenden Gründen genau zum erwarteten Verhalten.
Semantik ist das, was wir mit einem Ausdruck meinen.

2) Syntaktische Korrektheit:
Der Code entspricht genau den formalen Regeln für die Bildung von Ausdrücken in einer Sprache.

Es gibt in Programmiersprachen und in natürlichen Sprachen Beispiele für Sätze die syntaktisch (grammatisch) korrekt sind, semantisch aber totaler Unfug, und natürlich auch den umgekehrten Fall.

Beispiel:

Code: Alles auswählen

boolean isPositive(int number) {
    if (number >= 0) {
         return true;
    }
    if (number < 0) {
        return false;
    }
}
Diese Methode is semantisch völlig korrekt, aber syntaktisch nicht, deshalb verweigert der Kompiler die Übersetzung. Er kann nicht erkennen, ob jemals ein return -Statement ausgeführt wird. Die Syntax von Java verlangt daher bei Methoden, die per Deklaration einen Wert zurückliefern, das ein return -Statement bedingungslos ereichbar ist.

Zusammenfassung:
Nur weil wir wissen, dass ein return Statement eh nicht erreicht wird (Semantik), ist das für einen Kompiler noch lange kein Grund keines da haben zu wollen, der prüft nämlich syntaktisch.

PhK
Gast

Re: exceptions beenden doch nicht alles...

Beitrag von PhK »

aDramaQueen hat geschrieben:das er was zurück haben will is ja klar, aber ich erstelle dann doch explizit eine exception für diesen fall. bsp:

public String methodeX(int key) throws InvalidPositionException{
........
default:
new InvalidPositionException("There's no way to do that here...");
return "Try another one...";
}
}
Bei mir funktionert so ein ähnlicher code, fehlt evtl nur das "throw" vor new InvalidPositionException() ?

Code: Alles auswählen

    public static String test() throws Exception{
        int t = (int)(Math.random()*5);
        switch(t){
            case 1 : return "hallo";
            default: throw new Exception();
        }
    }
//Kompiliert.
Weiterhin geht das folgende nicht:

Code: Alles auswählen

   public static String test() throws Exception{
        int t = (int)(Math.random()*5);
        switch(t){
            case 1 : return "hallo";
            default: throw new Exception(); return "Test";
        }
    }
//Kompiliert nicht. Fehler: unreachable statement, return "Test" wird markiert

Benutzeravatar
aDramaQueen
Mausschubser
Mausschubser
Beiträge: 84
Registriert: 10. Jan 2014 16:34

Re: exceptions beenden doch nicht alles...

Beitrag von aDramaQueen »

Alles klaro, inzwischen läufts. THX...
Bild
...Never go full retard...

steffen12
Sonntagsinformatiker
Sonntagsinformatiker
Beiträge: 205
Registriert: 14. Okt 2009 16:28

Re: exceptions beenden doch nicht alles...

Beitrag von steffen12 »

Die Texte, die den Exceptions übergeben werden, landen übrigens genau wie der return -String der Methode execute im Textbereich der GUI.

Gast
Gast

Re: exceptions beenden doch nicht alles...

Beitrag von Gast »

http://www.javabeginners.de/Schleifen_u ... eigung.php
Link zu der Switch-Case-Verzweigung

Dabei achte auf den Satz:
"Es ist wichtig darauf zu achten, dass nach Ausführung einer Anweisung der Schleifendurchlauf mit break unterbrochen wird, da die folgenden Sprungmarken sonst ebenfalls geprüft und ggf. ausgeführt werden."

Ich habe bisher kein break bei dir rausgelesen. Denk daran.

Benutzeravatar
aDramaQueen
Mausschubser
Mausschubser
Beiträge: 84
Registriert: 10. Jan 2014 16:34

Re: exceptions beenden doch nicht alles...

Beitrag von aDramaQueen »

das mit den breaks gilt aber nur, wenn du kein return-statement im jeweiligen fall hast.
ansonsten gilt die alte regel:

return beendet die aktuelle methode.

switch/case ist glaub ich über if/else ausdrücke implementiert worden. wenn du in ner if/else-abfrage
ein return-statement wirfst, beendet das ja auch die abfrage.
Bild
...Never go full retard...

Gast
Gast

Re: exceptions beenden doch nicht alles...

Beitrag von Gast »

Man wirft aber nicht wahllos returns in einer switch case Verzweigung, sondern beendet sie mit einem break ... So ist switch case nun mal gedacht.... Auch wenn es geht

Benutzeravatar
aDramaQueen
Mausschubser
Mausschubser
Beiträge: 84
Registriert: 10. Jan 2014 16:34

Re: exceptions beenden doch nicht alles...

Beitrag von aDramaQueen »

naja, ein return an sich is jetzt nichts verwerfliches. du kannst durchaus auch in void-Methoden ein return setzen. damit gehst du auf nummer sicher, dass die methode an diesem punkt beendet wird, egal was danach noch kommt.
mal davon abgesehen will in unserem speziellen fall, die execute-methode immer nen string zurück haben.
Bild
...Never go full retard...

Benutzeravatar
SophiaLi1
Kernelcompilierer
Kernelcompilierer
Beiträge: 542
Registriert: 5. Jan 2014 11:48

Re: exceptions beenden doch nicht alles...

Beitrag von SophiaLi1 »

Unabhängig von der Diskussion würde ich dir einfach vorschlagen, das PDF Controllerbau durchzulesen und if-else if usw. im Controller zu verwenden (:

Antworten

Zurück zu „Archiv“