web-dev-qa-db-ja.com

System.console()はnullを返します

ユーザーから入力/新しいパスワードを取得するためにreadLineBufferedReaderを使用していましたが、パスワードをマスクするために_Java.io.Console_クラスを使用しようとしています。問題は、アプリケーションがEclipseでデバッグされるときにSystem.console()nullを返すことです。私はJavaを初めて使用しますが、Eclipseがこれを達成するための最良の方法であると確信していませんか?ソースファイルを右クリックし、[デバッグ]> [Javaアプリケーション] ?

76
Gauls

これは バグ#122429 Eclipseの

35
swimmingfisher

このコードスニペットは、トリックを行う必要があります。

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でのテスト中、パスワード入力は明確に表示されます。少なくとも、テストできるようになります。テスト中に実際のパスワードを入力しないでください。実稼働用に保管してください;)。

32
formixian

コンソールがない場合、System.console()はnullを返します。

コードにインダイレクションの層を追加する によって、または外部コンソールでコードを実行して リモートデバッガーを接続する のいずれかでこれを処理できます。

13
McDowell

単純なコマンドラインアプリケーションを作成しようとしたときにも、この問題に遭遇しました。

System.inから独自のBufferedReaderオブジェクトを作成する別の方法は、次のようにJava.util.Scannerを使用することです。

import Java.util.Scanner;

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

String s = in.nextLine();

もちろん、これはコンソールのドロップイン置換ではありませんが、さまざまな入力機能にアクセスできます。

Oracleのスキャナーに関する詳細なドキュメント です。

8
MonkeyPaperwork

[〜#〜] api [〜#〜]によると:

「If標準入力および出力ストリームをリダイレクトせずに仮想マシンをインタラクティブなコマンドラインから起動すると、コンソールが存在し、通常は仮想マシンのキーボードとディスプレイに接続されます。仮想マシンが、たとえばバックグラウンドジョブスケジューラによって自動的に起動される場合、通常はコンソールがありません。 "

6
Emad Aghayi

docs によると:

バックグラウンドジョブスケジューラなどによって仮想マシンが自動的に起動される場合、通常はコンソールがありません。

6

Netbeansからアプリケーションを実行すると、このエラーメッセージが表示されます。他の答えから判断すると、IDEからアプリケーションを実行するときにこれが発生するようです。次の質問をご覧ください: Javaのコンソールから読み込もうとしています

ほとんどのIDEは、Java.exeではなくjavaw.exeを使用してJava code

解決策は、command line/terminalを使用してConsoleを取得することです。

2

Eclipseの実行構成では、コンソールを割り当てるかどうかを構成できると信じています-これがチェックされていることを確認してください。 (Eclipseを使用してからしばらく経ちましたので、特定の指示を出すことはできません)。

それがうまくいかない場合、間違いなくこの仕事をする何かは、デバッグモードでアプリケーションを起動し、Eclipseでプロセスに接続します。これを行う方法がわからない場合は、「Eclipseリモートデバッグ」を検索してください。

さらに、一般にrequireを割り当てることはお勧めできません。これは、発見したばかりのアプリケーションの柔軟性に大きな影響を与えるためです。 Javaを呼び出す多くの方法は、コンソールを割り当てず、アプリケーションはこれらのインスタンスでは使用できません(これは悪いことです)。おそらく、コマンドラインで引数を指定することもできます。コンソール入力をテストするのは特に十分ですが、スクリプトやヘッドレスサーバーからアプリケーションを起動できると便利な場合があるため、この種の柔軟な設計はほぼ常に良い考えです。よく組織化されたコードにもつながります。)

1
Andrzej Doyle

そうです。

Eclipseの外部でアプリケーションを実行する必要があります。 Eclipse内のランチャー構成パネルを見て、別のJVMでコマンドを実行するというオプションを見つけられるかどうかを確認してください。

0
Stephen C