コード内の問題をリストすることから始めましょう:
return
ステートメントのコンパイルエラーはfs
、他の回答で説明されているように範囲外であることが原因で発生します。
に再帰呼び出しをgetFileScanner()
行う場合、結果を割り当てたり返したりすることはありません。したがって、発信者には戻されません。
ブロックでを使用することはreturn
悪い考えです。その時点で伝播している可能性のある他の例外をすべて押しつぶします(破棄します)。たとえば、と一致しない例外、またはブロックでスローされた例外。finally
catch
catch
input.nextLine()
基になるストリームがEOFに達した場合、呼び出しは例外をスローします。たとえば、ユーザーが[CONTROL]+Dなどと入力しました。あなたはそれを捕まえる必要はありません(それはチェックされていません)が、finally
ブロックのリターンはそれを(おそらく)押しつぶし、null
代わりに発信者を取得します。うーん..。
ハードワイヤリングにより、メソッドの再利用性が低下しますSystem.in
。System.out
(OK、これはこの特定のケースで対処する必要のある問題ではない可能性があります。以下では対処しません...)
StackOverflowError
理論的には、あなたのメソッドは;をスローするように作成できます。たとえば、ユーザーが[ENTER]を何度も押した場合。この問題は再帰的ソリューションに固有のものであり、そのようにしないのは十分な理由です。
最後に、これらの問題に対処するメソッドのバージョンを次に示します。
public static Scanner getFileScanner() throws NoSuchElementException
{
Scanner input = new Scanner(System.in);
while (true) {
String file = input.nextLine();
try {
return new Scanner(new FileReader(file));
} catch (FileNotFoundException fe) {
System.out.println("Invalid filename. Try another:");
}
}
}
再帰を置き換え、を取り除き、finally
スローされる例外を宣言したことに注意してください。(その例外をキャッチして報告するか、アプリケーション固有の例外として再スローすることができます。)