質問: Double.parseDouble(br.readLine()); System.out.println("cm"); } catch (NumberFormatException e) { System.out.println("数値を入力してください"); i--; } } ``` と書いたら ![![イメージ説明](https://teratail.storage.googleapis.com/uploads/contributed_images/ce84fcebb1c70e4c3a46f8d6958df569.png) のように表示がされます。 BufferedReaderのreadLineメソッドは一行ずつ読み込み改行をしていく仕様となっているようなのですが、何か方法はありますでしょうか? 最初からcmが表示されていても、底辺の値を入力してからcmが表示されるようにでも、どちらでも大丈夫です。よろしくお願いいたします。
回答: まずなぜそうなるのかという理由を説明します。BufferedReader が原因ではないかとの事でしたが、実際にはそれのコンストラクタに渡している System.in が理由です。リダイレクト等を行っていないのであれば System.in は端末に紐づけられており、それは標準的に行入力になります。つまり端末の仕様になるのです。 ここからうんちく 一件なんだそれはと思われるかもしれませんが、「行で文字入力を確定する」という事は間違ってタイプしてバックスペースを押して再度打ち直して、といったキー操作が最終の文字列で確定出来るという良さを持っています。もし1文字タイプするごとに結果が返ってしまったらバックスペースキーもプログラムが扱わないといけなくなります。 つまり端末は標準で入力された物を画面にも出しつつ行を編集する機能を提供してくれている訳です。それを読み取っているのが readLine になります。readLine は読むだけですので途中で行ったバックスペースキーの入力等は知りません。あくまで行が確定した段階の文字列だけが読み取られます。 色々と書きましたが答えを言うと「できません」が回答になります。ほんとに出来ないのかと言われると幾つか案があります。ただしどれもそぐわないと思います。 1. 端末のキー入力を読み込んで処理する バックスペースや矢印キーなど多くの処理を自分で実装する必要があります。 2. CTRL-D で確定する readLine が読み取れる様になるのは、行が確定する(エンターキーが押される)か EOF (ストリームの終わり)が条件です。CTRL-D をタイプすると後者を送る事が出来ます。ただしこれが動作するのは UNIX だけになります。キャプチャを見させて頂く限り Windows ぽいので、残念ながら使えません。