質問: (flg)? "True" : "False"; System.out.println(msg); } else{ throw new IllegalArgumentException("nullです"); } } } else{ throw new IllegalArgumentException("値が不正です"); } } } } ``` ### 試したこと 課題に対してアプローチしたことを記載してください ### 補足情報(言語/FW/ツール等のバージョンなど) より詳細な情報 テストケースを受けるだけの立場ですのでテストケースで何が投げかけられているかは分かりません。 ただScannerが、そもそもこのプログラムでも、 特に明記されていないかぎり、nullパラメータをScannerのいずれかのメソッドに渡すと、NullPointerExceptionがスローされます。 なのでScannerのnullを除去または対応したいです。
回答: > > テストケースを受けるだけの立場ですのでテストケースで何が投げかけられているかは分かりません。 > > > 思うにここがポイントです。あなたが何かをテストするために書いたプログラムはmainメソッド全部でしょうか?もしそうなら別のプログラムが生成した出力を標準入力から読み込んで内容をチェックするためのテストプログラムのはずです。そうであれば * 入力のテストケースはこれこれである * パスする条件はこれこれである * このテストプログラムはテストがパスしたかどうかでこれこれの出力をする というテストプログラムの仕様を言えるはずなので、入力のケースがわからないということはありえないと思います。そこが回答者を混乱させている原因と思います。ひょっとしたらあなたも混乱しているのかもしれません。ご自分がすべき仕事の内容を今少し明確に述べるべきです。 それはさておき、このプログラムが行っていることだけに注目してプログラムの論理がおかしいところを推測することは可能です。このプログラムが想定する入力仕様を推測すると例えば次のようなもののはずです。 1. 入力は任意個数のブロックからなる 2. 各ブロックはN+1行からなる 3. 各ブロックの先頭行にはそのブロックに含まれている行数Nを示す整数がある ... もしこの推測通りなら1.~3.についてエラーケースとして考えられるのは以下のようなものです。 A. (区切り文字を除いた)ブロックの先頭に整数がない B. ブロックの先頭の整数(=N)が0以上100以内の範囲にない C. ブロックの先頭以外の行がN行なかった(N行読み込む前にファイルの終端に達した) ... このプログラムの処理と見比べるとあやしいと思われる点があります。(仕様如何で問題かどうかは変わるので単にあやしいといえるだけですが) (1) ブロックの先頭に整数がなかった場合に別の例外が発生する (2) Bをパスしなかった場合にIllegalArgumentExceptionをthrowしている そういう仕様ならいいですが、"nullです"という例外を投げていけないならこの例外もダメでは?と思えてきます。 (3) Cをパスしない場合の論理に矛盾がある hasNextLineがfalseになってもエラーとしていないことから「行がある間はデータを読み込むが必要行数以下でもエラーにしない」と読めますが、一方forループでは「必ずN行ある」と想定した処理になっています。 (3)について「N行以下しかデータがない場合も許容する」ならばfor文の処理対象要素の入れ物に固定的な大きさで生成した配列(つまり`new String[number]`している配列)を用いることはおかしいです。配列ではなくListなどにして読み込めた行のデータのみをforループの処理対象にすべきです。 (3)について「N行以下しかデータがない場合を許容しない」ならばhasNextLineメソッドがfalseになった瞬間に直ちにエラー処理をすべきです。もし「読み込めた行の範囲内で各行のチェックもしたい」のであればやはり配列ではなくListを用いるべきです。