2010-07-27 10 views
6

Sagen Sie, wenn ich den Code unten habe, bestimmt es im Grunde, dass eine Bedingung übereinstimmt, und weisen Sie dann den booleschen Wert zu, dann führen Sie einige Codes aus. Dann wird eine Ausnahme ausgelöst, wenn der Wert booleanValue false ist. Was passiert, wenn ich möchte, dass eine Ausnahme sofort ausgelöst wird, wenn der Wert booleanValue false ist, ohne dass die restlichen Codes ausgeführt werden? Wenn ich nur die zweite bedingte Anweisung in die erste gebe, wird es doppelte Codes geben. Bitte zeigen Sie mir eine kluge Möglichkeit, dies zu tun (ich habe den Code so verändert, dass er wie meine tatsächlichen Codes aussieht).Eine bedingte Anweisung in Java umschreiben

boolean booleanValue = false; 
Permission value; 

if (someCondition) { 
    value = getPermission_1(); 
    booleanValue = someMethod(value); 
    useValue_1(value); 
} 
else { 
    value = getPermission_2(); 
    booleanValue = anotherMethod(value); 

    useValue_2(value); 
} 

if (!booleanValue) { 
    throw Exception(); 
} 

Antwort

7

Wie wäre es mit der Beseitigung der booleschen Variable? Sie könnten Ihren Code wie folgt umschreiben:

if (someCondition) { 
    if (!someMethod()) { 
    throw new Exception(); 
    } 
    some codes... 
} 
else { 
    if (!anotherMethod()) { 
    throw new Exception(); 
    } 
    some codes... 
} 

, die leichter in die Augen sieht, aber solche Dinge sind Geschmackssache ...

Extra-Vorteil: Wenn die Ausnahme endet in einem Stapel-Trace-up Sie wissen, was die Bedingung war, weil Sie zwei verschiedene throw-Anweisungen haben. Das kann das Debugging ein wenig beschleunigen.

+0

Ich mag das, weil es einfach und klar aussieht. – newguy

4

Statt

booleanValue = anotherMethod(); 

Sie einfach

if(!someMethod()) 
    throw new SomeException(); 

Auf wirft eine allgemeine Ausnahme schreiben würde - nicht. Der Grund dafür, dass Sie eine Ausnahme auslösen, besteht darin, dem Anrufer mitzuteilen, dass etwas Außergewöhnliches aufgetreten ist. Es ist fast immer nützlich, ihnen zu sagen, was sonst, weder der Anrufer noch Sie können etwas dagegen tun.

+0

Sie haben Recht, aber was ich fragte, ist eine andere Frage, deshalb habe ich keinen bestimmten Exzeptionsnamen angegeben. – newguy

+1

Nur um darauf hinzuweisen, wäre es, wenn (! SomeMethod()) mit dem ursprünglichen Code zu halten – MadMurf

+0

In der Tat ist das Problem komplizierter als das, bitte werfen Sie einen Blick auf meine modifizierten Codes. – newguy

2

Unter der Annahme, die beiden some codes... unterschiedlich sind, werden Sie wahrscheinlich tun wollen:

boolean booleanValue = someCondition ? someMethod() : anotherMethod(); 
if(!booleanValue) { 
    throw new Exception(); 
} 

if(someCondition) { 
    // some code 
} else { 
    // some code 
} 

Wenn sie die gleiche die if(someCondition) sind nicht erforderlich


Wenn (hypothetisch) Sie haben statisches Analysewerkzeug, das keine ternären Ausdrücke zulässt, können Sie die ersten Zeilen durch folgende ersetzen:

boolean booleanValue; 
if(someCondition) { 
    booleanValue = someMethod(); 
} else { 
    booleanValue = anotherMethod(); 
} 
+0

Das ist schlechter Code-Stil für mich. Würde auf der CheckStyle-Stufe scheitern. – newguy

+2

@newguy Nun, du wirst definieren müssen, was dein guter Code-Stil dann ist; Ich habe kein Problem mit diesem Code –

+0

Mein Projekt verwendet ein Check-Stil-Plugin, das keinen Code wie die erste Zeile erlaubt, so dass ich diese Regel befolgen muss. – newguy

1

Die offensichtliche Lösung ist:

boolean booleanValue = false; 

if (someCondition) { 
    booleanValue = someMethod(); 
    if(booleanValue){ 
     //some codes... 
    } 
} 
else { 
    booleanValue = anotherMethod(); 
    some codes... 
} 

if (!booleanValue) { 
    throw Exception(); 
} 

... aber ich habe nichts dagegen das if(!booleanValue) throw Exception(); Bit wiederholen, weil es wahrscheinlich ein konzeptionell anderen Grund, dass Sie die Ausnahme sind zu werfen. (Sie könnten z. B. in Ihrer Ausnahmebedingung eine bessere Fehlermeldung angeben.)

+0

Das ist nicht die Lösung. Ich möchte die Ausnahme direkt nach der Zuweisung des booleanValue auslösen, weil ich nicht möchte, dass der Rest der Codes ausgeführt wird. – newguy

+0

@newguy: Schau nochmal, bitte. Das ist es, was es macht. Ein wenig unklar für meinen Geschmack. Ich bevorzuge die Antwort von Joel und Nils. –

+0

@newguy: Diese Lösung gibt Ihnen das, wonach Sie gefragt haben. Persönlich mag ich den Stil nicht, aber es ist wahrscheinlich die Lösung mit dem am wenigsten bearbeiteten Unterschied. – Akusete

1

Es ist alles sehr subjektiv, vielleicht?

boolean booleanValue = aBoolean; 
if (someCondition) { 
    if (!someMethod()) { 
     throw new SomeException(); 
    } 
    some codes... 
} else { 
    if (!anotherMethod()) { 
    throw new AnotherException(); 
    } 
    some other codes... 
} 
1

Ihre beste Lösung ... wäre

if (someCondition) { 
    value = getPermission_1(); 

    if (!someMethod(value)) { 
    throw new SomeException(); 
    } 

    useValue_1(value); 
} 
else { 
    value = getPermission_2(); 

    if (!anotherMethod(value)) { 
    throw new AnotherException(); 
    } 

    useValue_2(value); 
} 

Und Sie sollten schauen auf sie nicht als Code zu duplizieren, weil, wenn Sie eine Ausnahme werfen wollen, dann würde die Erwartung, dass der Grund für die Ausnahme wäre in jedem Fall anders und daher sollte jeweils eine andere Ausnahme oder eine andere Nachricht übergeben werden.

Ich nehme an, Sie möchten wissen, welche Bedingung ausgeführt wurde und anschließend fehlgeschlagen, weil alles, was Sie zurück bekommen, ist ein Boolean von Ihrem ... Methode nennt den Grund für den Fehler wird wahrscheinlich nicht in diesem offensichtlich sein Szenario.

0

Das riecht irgendwie ... wie in "Code-Geruch". Ein Rückgabewert wird in eine Ausnahme übersetzt. Es scheint, dass, wenn der Aufrufer someMethod und anotherMethod geschrieben hat, die Lösung darin besteht, diese Methoden neu zu schreiben und die Ausnahme von diesen Methoden zu werfen, anstatt einen Rückgabewert zu verwenden. Aber das ist nur, wenn der Programmierer Zugriff auf den Code hat. Wenn es sich um einen API-Aufruf eines Drittanbieters handelt, muss die Übersetzung möglicherweise stattfinden.