2012-04-09 4 views
1

Dies ist wahrscheinlich eine grundlegende Frage, besser durch Code erklärt:Wie man richtig Standardvariablen Werte falsch handhaben sein

public void checkStatus { 
     int status = UNKNOWN; 
     if (somecondition) { 
      status = STATUS_UP; 
     } elseif (someothercondition) { 
      status = STATUS_DOWN; 
     } 
    } 

Das Problem ist also, ich definitionsgemäß nicht alle möglichen Bedingungen wissen, dass die beeinflussen könnten STATUS, und ich wollte nicht, dass der Compiler den Fehler "mein nicht definierbarer" auslöst, indem er die lokale Statusvariable nicht initialisiert.

Unter dem Strich funktioniert meine App nicht mit einem Status auf UNKNOWN gesetzt, ich habe es nur eingestellt, um den Compiler zu halten.

Frage: Wie kann ich das elegant angehen, ich habe überlegt, am Ende der Methode eine fatale Ausnahme zu werfen, sollte der Status trotzdem UNBEKANNT sein, aber das fühlt sich ein bisschen "hässlich" an.

Vielen Dank.

+2

Wenn Ihre App mit dieser Bedingung überhaupt nicht umgehen kann, ist das Werfen von Klängen durchaus vernünftig. – Mat

+1

Wenn Ihre App nicht funktioniert, dann ist es das Beste, den Client durch das Auslösen der entsprechenden Ausnahme zu informieren, anstatt darauf zu warten, dass die Sachen später wieder zerbrechen. – Dan

+1

Sie haben keine Möglichkeit, wenn Ihre Bedingung (en) falsch ist und Sie Werde auch keine 'Exception' werfen, was machst du? Antwort ist: Sie müssen eine von zwei Möglichkeiten wählen. – MJM

Antwort

1

Ich habe immer ein throw am Ende der if/then/else Kette, und Sie den Standardwert auf die Variable im Voraus nicht zuordnen. Wenn die Ausnahme ausgelöst wird, teilt es mir nicht nur mit, dass die Anwendung nicht fortgesetzt werden kann, sondern meldet auch, warum sie nicht fortgesetzt werden kann. Darüber hinaus tut es das, sobald es herausfindet, dass es nicht fortfahren kann, was für die Fehlerberichterstattung sehr wünschenswert ist (im Allgemeinen möchten Sie so schnell wie möglich einen Fehler melden).

Es ist ein Sonderfall, wenn Sie Ihren Code so strukturiert, dass die Kombination von somecondition s so ist, dass Sie nie den Schwanz der if/then/else Kette laufen, aber der Compiler kann es nicht automatisch überprüfen. Sie haben beispielsweise die Eingabe zuvor validiert, und Sie wissen, dass Ihr Code keinen Pfad enthält, der sie ändern kann. In diesem speziellen Fall sollten Sie eine Assertion verwenden, anstatt eine Ausnahme auszulösen, da dies eher auf einen Fehler in Ihren Überlegungen zu Ihrem Code hinweist als auf einen einfachen Codierungsfehler.

1

Sie können den Standardwert für die Statusvariable nur in die "sonst" -Bedingung setzen, so dass, wenn eine if Bedingung nicht bestanden wird, der Status mindestens einen Standardwert erhält.

1

Ich würde empfehlen, dass Sie ein enum anstelle von Ganzzahlen versuchen.

Ihr Code könnte mit einem UNKNOWN-Status arbeiten - das ist, was Sie von der else-Klausel zurückgeben, wenn Sie if/else if/else schreiben oder die Standardbedingung, wenn Sie switch verwenden.

Eine Ausnahme auslösen kann auch funktionieren. Es ist eine Designentscheidung, die Sie treffen können. Sie sollten eine Ausnahme verwenden, wenn ein unbekannter Status wirklich eine Ausnahmesituation ist. Wenn es üblich ist, würde ich mich auf das Enum konzentrieren.

Verwandte Themen