2017-12-21 6 views
-2
int selection; 
    while (true) { 
     selection = printing(); 
     if (selection == 4) { 

      id = starting(); 

      if (id < 1 || id > 10) { 
       if (id == -20150901) { 
        System.out.println("Exit code entered"); 
        break; 
       } 

       id = incorrectId(id); 
      } 
     } 


    } 


public static int printing(){ 
    Scanner sc = new Scanner(System.in); 
    System.out.print("Main menu\n1: check balance\n2: withdraw\n3: deposit\n4: exit\nEnter a choice: "); 
    System.out.print("Enter a choice: "); 
    int selection = sc.nextInt(); 
    return selection; 
} 

이것은 내 Java 코드의 일부입니다. 세 번째 줄에 NoElementException이 발생했습니다. 전체 코드가 필요한 경우 복사하여 여기에 붙여넣고 내용을 설명합니다. 이 예외는 어떻게 해결할 수 있습니까? 루프가 시작될 때마다 키보드 입력을 원합니다.NoElementException in java

감사합니다.

+0

_Which_ 세 번째 줄, 맨 위 또는'main()'방법? 질문을 게시하기 전에이 문제에 대한 도움을 얻기 위해 여기 주변을 찌르셨습니까? –

+0

'nextInt()'는 사양에 따라 "입력이 고갈되면"NoSuchElementException을 던집니다. 표준 입력은 비어 있어야합니다. 프로그램의 표준 입력은 무엇입니까? – bcsb1001

답변

0

printing()을 호출 할 때마다 코드에서 System.in을 래핑하는 새 스캐너를 만듭니다. 이것은 잘못되었습니다. 대신 응용 프로그램에서 정확히 Scanner을 랩핑하여 System.in을 만들어 어딘가에 저장하고 각각 printing() 호출 및 사용자가 System.in에서 읽는 다른 모든 장소에 다시 사용해야합니다.

Scanner 개체를 여러 개 만드는 문제는 hashNext*next* 방법을 일으킬 수있는 문자 수 스캐너의 버퍼에 문자를 "미리 읽기"하는 것입니다. 따라서 첫 번째 printing()은 모든 문자를 "소비"할 수 있습니다.


이제 실제 문제가 아닌 것 같습니다.

  • 표준 입력이 비어있을 수도 있고,
  • 당신은 코드의 다른 부분에 System.in을 폐쇄 (직접 또는 간접적으로) 할 수있다 : 다른 원인이 될 수 있습니다.

그러나, 나는 확인 된 문제는 버그가 있음을 원인 응용 프로그램의 다른 상황에서 실패 ... 그리고 그것을 이해하고 그것을 해결하는 것이 좋습니다.

+0

감사합니다. Scanner sc = new Scanner (System.in); 클래스 선언 바로 다음에 문제가 발생했습니다. 정적 컨텍스트에서 참조 할 수 없습니다. 그래서 static을 default로 변경했습니다. 그러면 주된 방법들로 해결할 수 없습니다. ..... –

+0

'정적'의 의미와 정적 변수 및 인스턴스 변수의 작동 방식에 대한 강의 노트를 검토해야합니다. 정적 * 변수 *는 정적 메소드 또는 인스턴스 메소드에서 액세스 할 수 있습니다. 인스턴스 변수는 컴파일러에게 * 당신이 말하는 인스턴스를 알리는 경우에만 인스턴스 메소드에서 참조 할 수 있습니다. –