2014-12-12 5 views
1

실제로 스레드를 통해 대답을 찾으려고했지만 여전히 약간의 피드백을 얻을 수 있기를 바랍니다.메서드의 스캐너 개체 및 NoSuchElementException

아래의 코드는 나쁜 스타일입니다. 그러나 두 가지 방법으로 두 개의 Scanner 개체를 만들었으므로 번호를 입력 한 후 java.util.NoSuchElementException을 쓴 이유를 모르겠습니다. 새 입력을 시작할 수 있어야합니다. inputAndPrintNumber()에서 input.close()을 지우면 올바르게 작동하고 컴파일됩니다. 가능하다면 스캐너 스캐너 obj를 사용하고 input.close()을 지우지 않으면 왜 고쳐야하는지, 어떻게 고칠 수 있는지 정말 알고 싶습니다.

import java.util.*; 
public class t{ 

public static void main(String [] args){ 
    inputAndPrintNumber(); 
    inputAndPrintString(); 
} 

public static void inputAndPrintNumber(){ 
    Scanner input = new Scanner(System.in); 
    String s = input.nextLine();   
    System.out.print(s);   
    input.close(); 
} 

public static void inputAndPrintString(){ 
    Scanner input2 = new Scanner(System.in); 
    int a = input2.nextInt();  
    System.out.print(a); 
} 
} 

아래 코드가 더 좋은지 또는 더 좋은 아이디어인지 확실하지 않습니다. 당신이 scanner.close()를 호출 할 때

import java.util.*; 

public class t{ 
public static Scanner input = new Scanner(System.in); 
public static void main(String [] args){ 
    inputAndPrintNumber(); 
    inputAndPrintString(); 
    input.close(); 
} 

public static void inputAndPrintNumber(){ 
    String s = input.nextLine();   
    System.out.print(s); 
} 

public static void inputAndPrintString(){ 
    int a = input.nextInt();   
    System.out.print(a); 
} 
} 

답변

2

는 스캐너를 종료하지만, 또한이 경우 System.in에서 데이터를 읽고있는 스트리밍뿐만 아닙니다. 따라서 나중에 사용하려고하면 System.in을 닫지 마십시오 (닫혀있는 경우 다시 열 수 없으므로 예외적으로 모든 데이터를 읽을 수 없습니다).

두 번째 코드 예제는 입력 스트림에서 읽은 내용이 없음을 확신 할 때 스캐너가 닫히기 때문에이 문제를 해결합니다.

은 BTW는 nextLine 및 호출해야 nextInt 당신이 혼합 된 곳 ( nextLine 보인다는 inputAndPrintNumber에 대한 nextInt 동안 inputAndPrintString 더 적합 할) 것 같다.

+0

Pshemo에 감사드립니다. 어떤 방법 으로든 스캐너 객체를 보내도록 선택합니다. 입력이 필요합니다. 이 작업을 수행하는 가장 좋은 방법은 궁금합니다. –

+0

스캐너를 어떻게 사용 하느냐에 따라 달라지기 때문에 어느 쪽이 가장 좋은지 알기 어렵습니다. 요점은 더 많은 데이터를 읽으려는 경우 사용자가 데이터를 읽지 않고 닫을 때마다 스캐너를 다시 작성하지 않는 것입니다. main 메소드에서 스캐너를 생성하고 다른 메소드로 넘겨 주길 원한다면 괜찮습니다. 또한 두 번째 접근법을 사용하는 것이 좋지만 액세스 가능성을 'public static Scanner input = new Scanner (System.in);'로 변경하는 것은 여러분이 하나의 스캐너를 작성하고 메소드에서 다시 사용하기 때문입니다. – Pshemo