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


78

내가 사용하고 있었다 readLine의 BufferedReader입력 / 사용자의 새 암호를 얻을 수 있지만, 내가 사용하려고두면 암호 마스크 싶어 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.