이클립스에서 디버깅하는 동안 system.console
을 시뮬레이트하기 위해이 사용자 정의 클래스를 사용하고 있습니다. 혼란스러운 점은 readLine
의 두 번째 호출 후에 reader = new BufferedReader(new InputStreamReader( System.in));
이 null을 반환한다는 것입니다. BufferedReader가 null을 돌려 준다
의 InputStream의 close 메소드는 아무것도하지 않습니다에 따라했기 때문에 그것은 생각했다.
그래서 이제 나는 혼란 스럽습니다. 여기에 코드입니다 :
public class CustomConsole {
public String readLine(String format, Object... args) {
if (System.console() != null) {
return System.console().readLine(format, args);
}
BufferedReader reader = null;
String line = null;
try {
System.out.print(String.format(format, args));
reader = new BufferedReader(new InputStreamReader(
System.in));
line = reader.readLine();
} catch (IOException e) {
Logger.fatal(e.getMessage());
System.exit(-1);
} finally {
if (reader != null) {
try {
reader.close();
} catch (IOException e) {
Logger.error("CustomConsole.readLine(): BufferedReader could not be closed");
e.printStackTrace();
}
} else {
Logger.error("CustomConsole.readLine(): BufferedReader is null");
}
}
return line;
}
public String readLine() {
return readLine("", "");
}
public char[] readPassword(String format, Object... args) {
if (System.console() != null) return System.console().readPassword(format, args);
return this.readLine(format, args).toCharArray();
}
}
"BufferedReader"가 닫히지 않으면 내 프로그램이 끝날 때 누수가 발생하지 않습니까? – Wusiji
두 가지 사항을 이해해야합니다. 1) 다른 독자의 래퍼 인 표준 Readers/InputStream의 모든 close() 메서드는 기본 판독기/스트림을 닫습니다. 따라서 시스템을 사용하는 마지막 스트림 만 실제로 닫을 가치가 있습니다. 그리고 귀하의 경우 그것은 System.in이기 때문에 이것은 JVM에 의해 이미 처리되었습니다. –
저에게 해명 해 주셔서 감사합니다 – Wusiji