2017-05-02 1 views
0

Goto muss vermieden werden. Aber es gibt Fälle, wo Sie es nicht vermeiden können, ohne hässlichen Code.Vermeiden Sie "goto" in einer Schleife mit "brechen und Code nach Schleife nicht ausführen"

Betrachten wir diesen Fall:

Wenn ein Ausdruck in einer Schleife, wahr ist, Schleife brechen müssen.

Wenn Ausdruck innerhalb der Schleife immer falsch ist, muss nach dem Schleifenende ein Code ausgeführt werden.

Gibt es eine gute Möglichkeit, dies ohne Goto zu tun?

for (int x = 0; x < input.length; ++x) 
    if (input[x] == 0) goto go_here; // this is pseudocode. goto is not allowed in java 
// execute code 
go_here: 

Meine Lösung ist dies:

both: 
do { 
    for (int x = 0; x < input.length; ++x) 
     if (input[x] == 0) break both; 
    // execute code 
} while(false); 

Eine andere Lösung ist dies:

boolean a = true; 
for (int x = 0; x < input.length; ++x) 
    if (input[x] == 0) { a = false; break; } 
if (a) { 
    // execute code 
} 

Eine weitere ineffiziente Lösung (ähnlich goto), ist dies:

try { 
    for (int x = 0; x < input.length; ++x) 
     if (input[x] == 0) throw new Exception(); 
    // execute code 
} catch(Exception e) {} 
+0

Was genau möchten Sie sagen? 'goto' Anweisungen sind in Java nicht erlaubt. Es ist jedoch ein reserviertes Wort. – Logan

+0

Weil im ersten Fall, bricht, bricht Schleife und führt Code nicht aus. Im zweiten Fall endet die Schleife normal und der Code wird ausgeführt. – Chameleon

+3

Bist du zufällig Joe? http://thedailywtf.com/articles/do-while-false – clcto

Antwort

1

Hier ist eine andere Lösung:

both: { 
    for (int x = 0; x < input.length; ++x) 
     if (input[x] == 0) break both; 
    // execute code 
} 

Eine Blockanweisung ist eine Aussage, so dass Sie es ein Etikett geben kann .

6

Put Ihr Zustand in einer Methode:

void yourMethod() { 
    if (yourCondition(input)) { 
    // execute code. 
    } 
} 

boolean yourCondition(int[] input) { 
    for (int i : input) { 
    if (i == 0) return false; 
    } 
    return true; 
} 

Oder, wenn Sie eine verwenden möchten IntStream:

if (IntStream.of(input).noneMatch(i -> i == 0)) { 
    // execute code. 
} 
Verwandte Themen