質問: stdIn.nextInt(); triangle(m); } } } } ```
回答: 直接的な回答とはいえませんが・・・ 一見便利に見えるjava.util.Scannerですが、期待外の入力があったときの処理の仕方に若干ややこしい点があるように思えます。 なるべく混乱を避けてScannerを使おうとするなら、個人的に次のようなパターンで使うといいんじゃないかと感じます。 * 推奨パターン1 行がどこで分割されているかは気にしなくてよい場合の方法。文字列の読み込みはnext(), 文字列以外の読み込みはnextInt()などを使う。nextLine()は決して使わない。全ての入力が「正しい」と想定できる場合、言い換えれば期待外の入力(nextInt()に対して整数以外を入力とか)の場合はプログラム全体が異常終了してもかまわないという想定で使う。 * 推奨パターン2 行がどこで分割されているかは気にしなくてよい場合の方法。next()しか使わない。読み込めるのはデリミターで区切られた個々の文字列。整数などの数値もあくまで文字列表現として読み込む。期待するデータが文字列以外の物(整数や実数あるいは日付など)の場合は読み込んだ文字列に対してしかるべきメソッドで望むデータ型へ変換する。変換エラーが起きたらnext()で次の文字列を読み込むことでエラー回復を試みる。デバッグの際に「次に読み込まれる文字列が何か」が把握しやすい。 * 推奨パターン3 nextLine()しか使わない。読み込めるのは必ず行単位になる。空白やカンマで区切った複数のデータを読みたいならString#splitでまず文字列を分割する。その後、文字列以外の物を期待するなら推奨パターン2と同様にしてデータ型の変換をする。 推奨パターン1,2と異なり、今入力したのが何行目なのかを把握することが容易になる。この情報は実用的なプログラムを書く際に使うことも多い。例えば期待外のデータが入力されたときにエラーメッセージに行番号を必要とする場合など。このパターンを使うならもはやScannerではなくBufferedReaderでよい気もする。 Scannerの振舞いについて曖昧な理解のままnext(), nextInt(), nextLine()を混在して使おうとしても混乱することが多いように思います。特にプログラムを覚え始めの方にとって「字句解析を伴うリーダー」は動作の把握が難しく感じるのではないでしょうか。 ライブラリーの振る舞いについて調べたり考えたりすることができるような経験が積めて来たら、改めて「Scannerってこんな風に振舞うんだなぁ」を理解してより複雑な使いかたに挑戦するとよいと思います。