2012-06-08 2 views
0

콘솔에서 readPassword()를 사용하여 읽는 기능이 있습니다. 이 함수는 하나의 프로그램 반복에서 여러 번 호출됩니다. 그러나 일단 readPassword() 줄에 도착하면 Java io 예외가 계속 발생합니다. 이 오류가 사라지는 finally 절에서 close() 문을 제거했을 때 나타났습니다. 왜 이런 일이 일어나고 언제 독자를 제대로 닫아야합니까?Java io 핸들이 유효하지 않습니다. 예외

public void Func() 
{ 
     Console console = System.console(); 
     BufferedReader reader = new BufferedReader(new InputStreamReader(System.in)); 

     if (console == null) 
      System.out.println("Error!"); 

     try 
     { 
      char[] pwd = console.readPassword(); 
      String password = new String(pwd); 
      System.out.println("PW: " + password); 

      String input = reader.readLine(); 
      System.out.println("UserNm: " + input); 
     } catch (IOException e) { 
      System.out.println("IO EXCEPTION"); 
     } finally { 
      if (reader != null) 
      { 
       try 
       { 
        reader.close(); 
       } 
       catch (IOException e) 
       { 
        System.out.println("error"); 
       } 
      } 
     } 
     return null; 
} 

미리 도움을 청하십시오!

+1

예외 메시지는 디버깅 할 때 매우 유용합니다. 마찬가지로 :'e.printStackTrace();' – jn1kk

+0

제안 주셔서 감사합니다 :) 나는 내 실제 코드에서 stacktrace를 정기적으로 출력합니다. 이것은 단지 스텁 일뿐입니다. – user459811

답변

3

여기서는 독자가 필요하지 않으며 Console 인스턴스 만 사용하면됩니다.

public String Func() { 
     Console console = System.console(); 
     if (console == null) 
      throw new IllegalStateException("No console available"); 

     try { 
      String username = console.readLine("Username: "); 
      String pwd = new String(console.readPassword("Password: ")); 
      return pwd; 
     } catch (IOException e) { 
      e.printStackTrace(); 
      return null; 
     } 
} 

귀하의 질문에 편집 됨 편집. Console 클래스 만 사용하면 읽고 쓸 수 있기 때문에 리더/라이터가 필요하지 않습니다.

4

콘솔은 하나 뿐이며 System.in은 하나뿐입니다. 당신이 그것을 닫으면, 당신은 더 이상 그것을 읽을 수 없습니다! BufferedReader을 닫을 필요가 없으며 그렇게해야합니다. 그 전체 finally 블록은 그냥 사라져야 만합니다.

더 자세히 읽는다면, 나는 왜 당신이 인지 알지 못하며BufferedReader을 처음 생성합니다. 기능이없는 것 같습니다. 그냥 그걸 다루는 모든 코드를 삭제하십시오!

+0

함수를 호출 할 때마다 System.console()에 다시 액세스하더라도? 이것은 아마도 나에게 나쁜 관행 일 것입니다. 닫히지 않으면 가비지 수집을 통해 처리 할 수 ​​있습니까? – user459811

+0

가비지 수집은 닫히지 않아야하므로 *가 닫히지 않습니다. 걱정없이 System.console()을 여러 번 호출 할 수 있습니다. –

+0

죄송합니다. 원래 게시물을 다시 편집했습니다. 콘솔에서 편리한 readPassword() func에 액세스 할 수 있기 때문에 BufferedReader를 사용하여 사용자 이름과 콘솔에서 비밀번호를 읽었습니다. – user459811

1

Console을 닫지 마십시오. 프로그램이 더 이상 읽을 필요가 없을 때까지 열어 두십시오.

1

대신 java.util.Scanner와 같은 것을 사용하고 다른 사람들은 system.in을 닫으려고해도 걱정하지 않는다고 말합니다.

그래서 많은 청소기 : 없음 최대 깔끔한/예외 처리가 필요하지

Scanner in = new Scanner(System.in); 
String password = in.nextLine(); 
String username = in.nextLine(); 

.

+0

@ alex의 대답은 readPassword 비트 때문에 더 멋졌습니다. 문자열로 저장하지 않고 텍스트 출력을 억제하지 않습니다. – plasma147

관련 문제