2016-08-04 45 views
4

Ich möchte den Bereich von arr zu einer do ... while Schleife minimieren, so dass es zerstört werden kann, sobald die Schleife beendet ist .Minimieren des Bereichs einer Variablen in do ... while-Schleife [Java] - ERROR: Symbol kann nicht gefunden werden

Wenn ich erklären arrinnerhalb die do while Schleife, erhalte ich die Fehlermeldung:

symbol cannot be found

ich es direkt vor dem Zyklus erklären kann, aber dann halte ich aufgebläht arr in Erinnerung, auch wenn ich nicht tun brauche es nicht mehr.

//int[] arr = {0}; // this works, but the scope is outside the loop 
do { 
    int[] arr = {0}; // causes "cannot find symbol" on `while` line 
    arr = evolve(arr); // modifies array, saves relevant results elsewhere 
    } while (arr.length < 9999); 

Was ist der richtige Weg, um mit dieser Situation umzugehen?

Antwort

6

Sie haben:

  • Ein Anfangszustand
  • ein Abschlusszustand
  • Eine iterative Operation

So Sie alles, was eine for Schleife verwenden benötigt (wenn auch ohne Körper) :

for (int[] arr = {0}; arr.length < 9999; arr = evolve(arr)); 

Eine andere Lösung, aber bei weitem nicht so sauber ist diese nach die Schleife hinzuzufügen: Müll gesammelt werden und hat eine ähnliche praktische Wirkung zu beschränken Umfang

arr = null; 

die immer noch den zugewiesenen Speicher ermöglicht . Manchmal benötigen Sie diesen Ansatz, wenn Sie den Code nicht auf eine andere Weise umgestalten können.

2

Sie haben mehrere Möglichkeiten. Sie können boolean Token außerhalb eines Zyklus deklarieren und dagegen prüfen. Sie können das Ganze in einer Methode kapseln, die direkt nach do while endet.

2

@ Bohemian Lösung ist elegant.

Aber, wenn Sie noch

int l = 9999; 
    do { 
     int[] arr = { 0 }; // causes "cannot find symbol" on `while` line 
     arr = evolve(arr); // modifies array, saves relevant results elsewhere 
     l = arr.length; 
    } while (l < 9999); 
2

Sie könnten auch die Array außerhalb der do-while-Schleife definieren und wickeln Sie das Ganze mit erreichen wan't dies tun .. während sollte dann folgende Lösung arbeiten in einer kleinen Methode. Das Array wird dann nach Abschluss der Methode als Garbage Collected erfasst. Dies hilft auch bei der Strukturierung Ihres Codes.

1

Noch eine andere Option - obwohl wohl nicht besser als alle diejenigen, die bereits erwähnt - wäre es in einen Block zu wickeln:

{ 
    int[] arr = {0}; // this works, but the scope is outside the loop 
    do { 
     int[] arr = {0}; 
     arr = evolve(arr); // modifies array, saves relevant results elsewhere 
    } while (arr.length < 9999); 
} 

I @ martinhh Lösung obwohl es vorziehen würde - es ist nur ein Verfahren extrahieren mit einem aussagekräftigen Namen.

Die body-less for-Schleife ist auch in Ordnung - aber es wäre wahrscheinlich eine gute Idee, dort einen Kommentar zu hinterlassen, dass es in der Tat beabsichtigt, den Körper wegzulassen - solche Dinge neigen dazu, durch statische Analyse-Tools hervorgehoben und kann zu einiger Verwirrung führen.