System.console ()이 null을 반환합니다.


78

내가 사용하고 있었다 readLineBufferedReader입력 / 사용자의 새 암호를 얻을 수 있지만, 내가 사용하려고두면 암호 마스크 싶어 java.io.Console클래스를. 문제는 애플리케이션이 Eclipse에서 디버깅 될 때 System.console()반환 된다는 것 null입니다. 저는 Java를 처음 사용하고 Eclipse가 이것이 최선의 방법인지 확실하지 않습니까? 소스 파일을 마우스 오른쪽 버튼으로 클릭하고 "Debug As"> "Java Application"을 선택합니다. 해결 방법이 있습니까?


1
또한 참조 stackoverflow.com/questions/26470972/...를 내가 확인 System.out하고 System.in내 사용 사례에 대한 충분하고 사용 abondaned하기 System.console().
원 월드

답변:



33

이 코드 스 니펫은 트릭을 수행해야합니다.

private String readLine(String format, Object... args) throws IOException {
    if (System.console() != null) {
        return System.console().readLine(format, args);
    }
    System.out.print(String.format(format, args));
    BufferedReader reader = new BufferedReader(new InputStreamReader(
            System.in));
    return reader.readLine();
}

private char[] readPassword(String format, Object... args)
        throws IOException {
    if (System.console() != null)
        return System.console().readPassword(format, args);
    return this.readLine(format, args).toCharArray();
}

Eclipse에서 테스트하는 동안 비밀번호 입력이 명확하게 표시됩니다. 적어도 테스트 할 수 있습니다. 테스트하는 동안 실제 비밀번호를 입력하지 마십시오. 프로덕션 용도로 보관하십시오.).


손으로 굴린 readLine방법 BufferedReader이 finally (또는 try-with-resources) 블록에서 닫아야 합니까?
Andrew Swan

그렇지 않으면 System.in스트림 일치가 닫히고 나중에 더 이상 읽을 수 없기 때문입니다 .
formixian

예,이 스트림을 닫을 수 있다는 것은 이상합니다. 나는 그것이 안될 것이라고 예상했다.
Andrew Swan


9

또한 간단한 명령 줄 응용 프로그램을 작성하려고 할 때이 문제가 발생했습니다.

System.in에서 고유 한 BufferedReader 개체를 만드는 또 다른 대안은 다음과 같이 java.util.Scanner를 사용하는 것입니다.

import java.util.Scanner;

Scanner in;
in = new Scanner(System.in);

String s = in.nextLine();

물론 이것은 콘솔에 대한 드롭 인 대체가 아니지만 다양한 입력 기능에 대한 액세스를 제공합니다.

다음 은 Oracle의 Scanner에 대한 더 많은 문서입니다 .


7

문서 에 따르면 :

가상 머신이 예를 들어 백그라운드 작업 스케줄러에 의해 자동으로 시작되면 일반적으로 콘솔이 없습니다.


1
이 대답은 deamon이 활성화 된 상태에서 Gradle을 실행하는 경우 Gradle 작업에서 콘솔을 얻을 수 없다는 것을 알게되었습니다. '--no-daemon'을 사용하여 내 Gradle 작업을 실행하면 콘솔 액세스가 허용됩니다.
whitespy9 2015

이것은 명령 줄 도구에 drip ( github.com/ninjudd/drip )을 사용할 때 나에게 발생했습니다 . 이런!
George L

7

API 에 따르면 :

"나는 표준 입력 및 출력 스트림을 리디렉션하지 않고 대화 형 명령 줄에서 가상 머신을 시작하면 해당 콘솔이 존재하며 일반적으로 가상 머신이 시작된 키보드 및 디스플레이에 연결됩니다. 가상 머신이 시작된 경우 예를 들어 백그라운드 작업 스케줄러에 의해 자동으로 수행되는 경우 일반적으로 콘솔이 없습니다. "


4

Netbeans에서 응용 프로그램을 실행할 때이 오류 메시지가 나타납니다. 다른 답변으로 판단하면 IDE에서 응용 프로그램을 실행할 때 이런 일이 발생하는 것 같습니다. 이 질문을 살펴보면 Java의 콘솔에서 읽으려고 시도하기 때문입니다.

대부분의 IDE는 Java 코드를 실행하기 위해 java.exe 대신 javaw.exe를 사용합니다.

해결책은를 사용 command line/terminal하여 Console.


1

Eclipse의 실행 구성에서 콘솔을 할당할지 여부를 구성 할 수 있다고 생각합니다. (이클립스를 사용한 지 오래되어 구체적인 지시를 할 수 없습니다.)

그래도 작동하지 않으면 확실히이 작업을 수행 할 작업은 디버그 모드에서 애플리케이션을 시작한 다음 Eclipse로 프로세스에 연결하는 것입니다. 이 작업을 수행하는 방법을 잘 모르는 경우 "eclipse 원격 디버깅"을 검색하십시오.

게다가, 일반적으로 콘솔을 할당 하도록 요구 하는 것은 좋지 않습니다. 이것은 방금 발견 한 것처럼 애플리케이션의 유연성에 큰 영향을 미치기 때문입니다. Java를 호출하는 많은 방법은 콘솔을 할당하지 않으며 이러한 인스턴스에서 애플리케이션을 사용할 수 없습니다 (나쁜). 또는 명령 줄에 인수를 지정하도록 허용 할 수도 있습니다. (콘솔 입력을 구체적으로 테스트하는 경우 충분히 공정하지만 스크립트 및 / 또는 헤드리스 서버에서 애플리케이션을 호출 할 수있는 사람들에게 잠재적으로 유용 할 수 있으므로 이러한 종류의 유연한 디자인은 거의 항상 좋은 생각입니다. . 종종 더 잘 구성된 코드로 이어집니다.)


예, 내 디버그 목적으로 만 사용되며 사용자는 셸 스크립트 또는 박쥐 파일을 받게됩니다. 콘솔을 사용하는 것이 gud 아닌가요 ?? 그렇다면 더 나은 방법은 무엇입니까
Gauls

BTW 모든 원격 디버깅 검색은 abt 웹 서버를 말하지만 웹 응용 프로그램을 만들지 않습니다. 이것은 일반 자바입니다. 비밀번호를 마스킹하는 더 좋은 방법일까요?
Gauls

Java 프로세스를 원격 디버그 할 수 있습니다. 예를 추가하면됩니다. -Xdebug -Xrunjdwp:transport=dt_socket,server=y,suspend=n,address=8000 를 들어 VM의 인수에 하기 됩니다 (적어도 Sun JVM에서는). 콘솔 사용은 괜찮을 수 있지만 지적했듯이 코드 가 없으면 코드 가 작동하지 않습니다 . 대신 명령 줄 인수, 시스템 속성, 속성 파일 등에서 직접 가져온 값을 전달하는 것이 좋습니다. 최소한 몇 가지 대안을 제공하십시오. 예를 들어 값 명령 줄 인수로 제공 되지 않은 경우에만 콘솔로 이동하십시오 .
Andrzej Doyle

1

나는 위에 표시된 formixian의 답변을 참조하고 사용했습니다. 요점은 "ojonugwa ochalifu"가 제안한대로 Java 프로그램을 실행하기 위해 (검은 색) cmd 콘솔을 사용하는 것입니다.

**


0

그거 맞아.

Eclipse 외부에서 애플리케이션을 실행해야합니다. Eclipse 내의 실행기 구성 패널을보고 별도의 JVM에서 명령을 실행하는 옵션을 찾을 수 있는지 확인하십시오.


0

IDE가 java 대신 javaw를 사용하는 경우 javaw는 본질적으로 콘솔 창이없는 java이므로이 문제가 발생합니다.


-1

프로그램 인수 에 -console 을 추가 하여 OSGi 콘솔을 시작하십시오.


1
가능한 경우 이에 대해 더 자세히 설명해 주시겠습니까?
갈리아

오늘 새로운 것을 배웠습니다. 감사합니다. 그러나 Eclipse는 여전히 내부 콘솔 내부에서 매개 변수를 읽습니다. 따라서 제안한 솔루션으로 원래 문제가 해결되지 않습니다.
Kiswanij
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.