2

私は Java に非常に慣れていませんが、VB.NET の経験は「ほとんど」ないため、はるかに寛容です。だから、ばかげた質問かもしれないことを許してください、そして私の貧弱な Java 語彙も許してください。コンソール アプリケーションのスニペットを次に示します。

do
{
    out.println("Please enter the name of your space bug and press <enter> to continue");
    out.println();
    bugOne.setName(keyInput.nextLine());

    out.println("You have entered '" + bugOne.getName() + "'.");
    out.println("Is this correct? (y/n)");

    confirmName = keyInput.findWithinHorizon(".",0).charAt(0);
}
while(confirmName != 'y' && confirmName != 'Y');

最初の繰り返しでは問題なく、入力した名前が表示されます。次に、確認に移動します。ここで「y」または「Y」を入力すると、コードの次の行に問題なくドロップします (ご想像のとおり)。

しかし、それ以外のキーを入力すると、2 回目の繰り返しを行ったときに、キーボード入力のために一時停止しません。Enter キーを押して confirmName リクエストを実行すると、コンソール ウィンドウで生成された行がすぐに読み取られます。

You have entered "".
Is this correct(y/n)?

キーボード入力のために一時停止しないのはなぜですか? (VB コンソール アプリでは、ユーザー入力のためにいつ一時停止するかを指定する必要がありますが、Java で見たところ、できないかできないか... またはできますか?)

また、アクセサ メソッド setName を介して設定された「name」変数が、2 回目の反復で自動的に何も値を割り当てられないのはなぜですか??

4

2 に答える 2

0

それはあなたがするときだからです

confirmName = keyInput.findWithinHorizon(".",0).charAt(0);

パターン ( .) を使用して、スキャナーに次の文字を見つけるように指示しています。ただし、ユーザーが応答を入力すると、複数の文字が表示されます (つまり、'n' と改行文字があります)。しかし、 findWithinHorizo​​n はその改行文字を取得しないため、戻ってきたときに

bugOne.setName(keyInput.nextLine());

そこに残っていた空の新しい行をすぐに拾います。これを修正するには、findWithinHorizo​​n の呼び出しの直後に次のコード行を追加します。

keyInput.nextLine();

したがって、次のようになります。

confirmName = keyInput.findWithinHorizon(".",0).charAt(0);
keyInput.nextLine();

しかし、本当に、このようなことをすることの害は何ですか? パターン マッチングのことは忘れて、文字列として読み込むだけです。

String confirmName;
do
{
    out.println("Please enter the name of your space bug and press <enter> to continue");
    out.println();
    bugOne.setName(keyInput.nextLine());

    out.println("You have entered '" + bugOne.getName() + "'.");
    out.println("Is this correct? (y/n)");

    confirmName = keyInput.nextLine();
}
while(!confirmName.equalsIgnoreCase("y"));
于 2013-09-13T04:06:30.657 に答える