2015-10-31 41 views
1

我想從我的方法中輸出文件掃描器對象。這是一個學校作業,我特別指示不要拋出任何異常,而是使用try/catch來代替。該任務要求命令行提示用戶輸入要掃描的文件。如果文件不存在,我們應該告訴用戶,然後再次提示他們輸入文件。如果該文件存在,則該方法返回掃描該文件的掃描器對象。如何使用try/catch避免在java中拋出FileNotFoundException

我的代碼有效,但它不乾淨。它涉及2種方法。這是到目前爲止我的代碼:

public static Scanner getInputScanner (Scanner console) { 
    File inputFile = null; 
    Scanner input = null; 
    try { 
     inputFile = getFile(inputFile, console); 
     input = new Scanner (inputFile); 
     return input; 
    } catch (FileNotFoundException e) { 
     try { 
      return input = new Scanner (getFile (inputFile, console)); 
     } catch (FileNotFoundException f) { 
      System.out.println("An error has occured."); 
      return input; 
     } 
    } 

} 

public static File getFile (File inputFile, Scanner console) { 

    System.out.println("Enter input file: "); 
    inputFile = new File (console.nextLine()); 

    while (!inputFile.exists()) { 
     System.out.println("File does not exist."); 
     System.out.print("Enter input file: "); 
     inputFile = new File (console.nextLine()); 
    } 
    return inputFile; 
} 

與代碼的問題是,輸出如下所示:

輸入輸入文件:

文件不存在。

輸入輸入文件:

然後它正在等待用戶的輸入。我不希望輸出在最後一行之前有兩行代碼。

任何人都可以解釋爲什麼我的代碼輸出這兩行嗎? 另外,是否有一個簡單的解決方案來獲取輸入文件而不拋出FileNotFoundException?

謝謝!

+0

您能告訴我們調用這些方法的代碼嗎? –

回答

0

如果我理解正確的,當你運行它 程序輸出這些線, 不管是什麼, 沒有你得到一個機會,以實際輸入一個文件名。

Enter input file: 
File does not exist. 

然後程序要求你再次:

Enter input file: 

而且你不希望上面的第一個兩行,對不對? 例如,如果您收到的Scanner console中有未讀的換行符,就會發生這種情況。 您尚未發佈過該代碼部分,因此很難分辨,但這是Scanner的常見問題。 在致電getInputScanner, 之前,請確保Scanner console已準備好使用, 中仍然沒有未讀垃圾。

至於你的問題的第二部分, 是的,這可以寫成簡單,更好,例如:

public static Scanner getInputScanner(Scanner console) { 
    try { 
     File inputFile = getExistingFile(console); 
     return new Scanner(inputFile); 
    } catch (FileNotFoundException e) { 
     throw new AssertionError("The file is expected to exist (was supposed to be verified earlier)"); 
    } 
} 

public static File getExistingFile(Scanner console) { 
    while (true) { 
     System.out.println("Enter input file: "); 
     File inputFile = new File(console.nextLine()); 

     if (inputFile.exists()) { 
      return inputFile; 
     } 
     System.out.println("File does not exist."); 
    } 
} 
+0

感謝您的輸入janos。是的,你是對的。無論如何,我的程序都會執行前兩行代碼。 –

+0

另外,感謝您回覆的代碼。這絕對是更簡潔。我剛剛使用它,但不幸的是,我得到了相同的輸出。我認爲你可能是正確的掃描儀有一些未讀的令牌緩衝。 –

+0

在調用此方法之前,在掃描器上調用nextLine可能是一個簡單的修復 – janos

0

它立即執行以下線的GetFile()被調用。 (「Enter input file:」);

由於沒有文件存在,下面的線將繼續執行:

而(INPUTFILE!存在()){

System.out.println ("File does not exist."); 
    System.out.print("Enter input file: "); 

您可以使用throws()而不是try/catch,那麼調用者將負責處理異常。

0

必須在獲取用戶輸入之前通過插入Scanner.nextLine()來消耗掃描儀攜帶的任何垃圾。最終代碼如下所示:

public static Scanner getInputScanner(Scanner console) { 
    try { 
     File inputFile = getExistingFile(console); 
     return new Scanner(inputFile); 
    } catch (FileNotFoundException e) { 
     throw new AssertionError("The file is expected to exist (was supposed to be verified earlier)"); 
    } 
} 

public static File getExistingFile(Scanner console) { 
    while (true) { 
     console.nextLine(); 
     System.out.println("Enter input file: "); 
     File inputFile = new File(console.nextLine()); 

     if (inputFile.exists()) { 
      return inputFile; 
     } 
     System.out.println("File does not exist."); 
    } 
}