Wir müssen etwas von einem lexikalischen Analysator machen, und ich hatte einige Probleme mit einer bestimmten Funktion von mir, useLoad, oder genauer gesagt, was passiert in Main, nachdem useLoad verwendet wurde.Ich kann nicht sehen, warum mein Scanner in Java eine "NoSuchElementException" wirft
Ich fand heraus, dass das war, weil ... aus irgendeinem Grund, buffer=keyboard.nextLine()
wirft den Fehler, weil es aus irgendeinem Grund nicht mehr Eingabe von der Tastatur bekommt. Ich dachte, dass .nextLine() es zwingen sollte, mehr Eingabe vom Benutzer zu bekommen. Und ich weiß nicht, warum es genau nach dieser einen Methode diese Ausnahme auslöst. Es kann andere Methoden gut machen und nicht seine Fähigkeit zu lesen verlieren. Liegt es daran, dass ich eine Variable namens Tastatur in einem anderen Objekt habe und diese geschlossen habe? Das scheint zweifelhaft. Ich habe gerade versucht, den Namen zu ändern. Hat keinen Unterschied gemacht.
Variablen, die im folgenden Code verwendet, aber nicht deklariert wurden: Schlüsselwörter [0] ist der String "load". initial = Die Scanner-Zeichenfolge, die an die Funktion übergeben wird. offset = eine Zählervariable, um zu sehen, wie weit wir in der Zeile sind, die wir gelesen haben. Die UseLoad-Funktion (die meiner Meinung nach irgendwie kaputt ist), ist unten, aber ich habe alles, was sie durchläuft (mit jeder Methode durch eine horizontale Regel getrennt), in chronologischer Reihenfolge eingefügt, nur für den Fall I Ich sehe einfach nicht, was vor sich geht.
public static void main(String[] args) {
Scanner keyboard = new Scanner(System.in); //the scanner for keyboard
int i = 0;
String buffer ="";
boolean loopControl == true;
SymbolTable mySym = new SymbolTable();
System.out.println("READY FOR INPUT\n");
while (loopControl == true){
//read in the line
buffer = "";
buffer = keyboard.nextLine();
if(!mySym.checkStop(buffer)){ //if we didn't stop
mySym.primary(buffer);
}
else{//if we did stop
closeLoop();
}
if (i >= 55){
loopControl = false;
System.out.println(("You have gone over the limit ("+i+" lines) per execution. Please continue by running this program again.").toUpperCase());
//just a safety precaution...you know... in case closeLoop doesn't work
}
i++;
}
keyboard.close();
}
if(initial.substring(0, Keywords[0].length()).equals(Keywords[0])){ //Load
//if this is working as expected, then we simply need to do what the keyword says to do.
offset += Keywords[0].length(); //we have moved this much deeper in to the line
useLoad(offset, initial);
offset = 0; //just make sure, once we are done with the line, we start back at the start of the next line.
return; //we found what we were looking for, get out.
}
private void useLoad(int offsetIn, String readIn) {
double doubIn = 0;
//now get the value of the
Scanner keyboard = new Scanner(System.in); //the scanner for keyboard
System.out.println("\nENTER VALUE FOR " + readIn.toUpperCase());
doubIn = keyboard.nextDouble();
keyboard.close();
variables.create(readIn.substring(offsetIn), doubIn);
}
Wo initialisieren Sie das 'loopControl'? – beatrice
'keyboard.close();' schließt die Tastatur (duh), so dass Sie nichts tippen oder lesen können. (Eigentlich ist das nicht * ganz * korrekt, aber nahe genug) – immibis
@beatrice Es war eine globale Variable in der Klasse von main (so dass andere Methoden damit umgehen konnten, wie closeLoop()). Deshalb wurde es nicht kopiert. Ich habe das vergessen. Ich habe es als lokale Variable hinzugefügt, da es keinen großen Unterschied macht. –