Erro de scanner que não consigo descobrir: NoSuchElementException

Está batendo na terceira linha dentro do loop do-while, e não espera pela minha input:

input = kb.nextInt(); 

Rastreamento de pilha:

Exceção no thread “main” java.util.NoSuchElementException

em java.util.Scanner.throwFor (fonte desconhecida)

em java.util.Scanner.next (fonte desconhecida)

em java.util.Scanner.nextInt (fonte desconhecida)

em java.util.Scanner.nextInt (fonte desconhecida)

em main.MainDriver.main (MainDriver.java:50)

Código relevante:

 do { displayFullMenu(); System.out.print("Selection: "); input = kb.nextInt(); switch (input) { //Create new survey case 1: currentSurvey = new Survey(); break; //Display current survey case 2: currentSurvey.display(); break; //Save current survey case 3: saveSurvey(currentSurvey); break; //Load a survey case 4: currentSurvey = loadSurvey(); break; //Modify a survey case 5: currentSurvey.modify(); break; /*******************Test Functions*******************/ //Create new test case 6: currentSurvey = new Test(); break; //Display current test case 7: currentSurvey.display(); break; //Save current test case 8: saveSurvey(currentSurvey); break; //Load a test case 9: currentSurvey = loadTest(); break; //Modify a test case 10: currentSurvey.modify(); default: System.out.println("Invalid choice. Please make a valid choice: "); input = kb.nextInt(); System.out.println(); } } while (input != 99); kb.close(); 

Ele falha depois que eu escolho a opção 9. Ele salva o arquivo corretamente, depois volta para o início do loop e falha na linha mencionada anteriormente. Eu quero pedir mais informações.

O que da?

Quando escolho a opção 8, em saveSurvey() , é necessário criar um novo Scanner (nesse método), porque tudo isso está dentro do meu método principal. Que poderia ser o problema?

Sim, esse poderia ser o problema. Se esse Scanner tiver a mesma origem ( System.in ?) Que kb e for close() d, isso fecha o stream subjacente e o kb não pode mais receber input.

Eu percebi isso.

O problema todo foi causado por eu não criar um scanner estático no main – e quando eu precisei dele em outros methods fora do main, eu criei novos.

Ao invés de

 public class MainDriver { public static Scanner kb = new Scanner(System.in); public void main(String[] args) throws IOException { 

Eu tinha:

 public class MainDriver { public static void main(String[] args) throws IOException { public static Scanner kb = new Scanner(System.in); 

Em seguida, criou novos scanners nos outros methods. No final desses methods, fechei o Scanner. Eu acho que estava fechando o scanner local, porque quando eu me livrei de todas as instruções close() que estavam dentro dos outros methods, o problema desapareceu.