2016-04-14 12 views
-1

ユーザー入力文字列を受け取り、それが有効なファイルであるかどうかを判断するisValidFileというメソッドがあります。メソッドの出力はファイルタイプです。私はコマンドラインで2つのファイル名を取り込み、それらを適切に処理することができます。私はまた有効な1つを無効にすることができます。 isValidFileは妥当性をチェックし、入力されたファイル名が正しくない場合、有効なファイル名をユーザーに提示します。ただし、2つの無効な入力に対しては機能しません。次のように私は、開始、終了、およびファイルを表示するには、テストラインに置く場所あなたが見ることができますJAVA - メソッドは第1呼び出しでは動作しますが、第2呼び出しでは機能しません

public static File isValidFile(String userFile){ 
    System.out.println("START OF isValidFile"); 
    File inFile = new File(userFile); 
    Scanner in = null; 
    while(!inFile.exists() || inFile.isDirectory()){ 
     System.out.println("Please enter a valid file name or Q to quit."); 
     in = new Scanner(System.in); 
     String validFile = in.nextLine(); 
     System.out.println("IS VALID FILE? " + validFile);   // TEST LINE 
     if(validFile.equalsIgnoreCase("q")){ 
      System.out.println("\nProgram terminated by user."); 
      in.close(); 
      return null; 
     } else inFile = new File(validFile); 
     if (inFile.exists()) in.close(); 
    } 
    System.out.println("END OF isValidFile\n"); 
    return inFile; 
} 

...ここ

String[] inLines = commandLine(args); 
    File reservedWords = isValidFile(inLines[0]); 
    File toParse = isValidFile(inLines[1]); 

は私isValidFile方法です....それらを呼び出します受け入れられた場合は名前が印刷されます。ここに私の出力です。最初の引数のために有効なファイルを入力すると、2番目の引数のファイル名を尋ねますが、何も情報を入力することはできません。 NoSuchElementExceptionがスローされます。なぜメソッドへの最初の呼び出しで、2番目の呼び出しでは機能しませんか? isValidFile

OF

START終了し、有効なファイル名またはQを入力してください。

in.txt

IS VALID FILE? isValidFile

OF isValidFile

START OF

END in.txt終了し、有効なファイル名またはQを入力してください。スレッド "メイン" java.util.NoSuchElementExceptionで

例外:java.util.Scanner.nextLine(不明なソース)Project6.isValidFileで

(Project6.java:53で

を見つけ ませラインProject6.mainで)

(Project6.java:9)

---線53は線である:文字列validFile = in.nextLine()。

--- 9行目は次の行です。File toParse = isValidFile(inLinse [1]);

+0

内部ではなく、ループの前に 'スキャナ 'を初期化する必要があります。そしてそれを閉じないでください! – Berger

+0

スキャナを閉じないでください。これで 'System.in'が閉じてしまいます...もう入力できません... – Codebender

+0

' commandLine(args) 'メソッドは何ですか? –

答えて

0

スキャナを閉じたくない場合は、System.inを終了します。 System.in(つまり標準入力)はプロセス全体で共有されるため、isValidFileへの各メソッド呼び出しは同じ標準入力からの読み取りです。 isValidFileの最初の呼び出しの終わりに閉じられると、次回の呼び出し時に失敗します。したがって、最初の入力には機能しますが、2番目の入力には機能しません。

public File isValidFile(String userFile){ 
    System.out.println("START OF isValidFile"); 
    File inFile = new File(userFile); 
    Scanner sc = new Scanner(System.in); 
    while(!inFile.exists() || inFile.isDirectory()){ 
     System.out.println("Please enter a valid file name or Q to quit."); 
     String validFile = sc.nextLine(); 
     System.out.println("IS VALID FILE? " + validFile);   // TEST LINE 
     if(validFile.equalsIgnoreCase("q")){ 
      System.out.println("\nProgram terminated by user."); 
      return null; 
     } else inFile = new File(validFile); 
    } 
    System.out.println("END OF isValidFile\n"); 
    return inFile; 
} 
関連する問題