2014-02-26 88 views
0

我有一個java類,用戶提供一個文件路徑,如果路徑不存在,我要求他們再試一次。我的教授說我們應該用一個例外來解決這個問題。處理無效文件異常的最佳方法是什麼?

這裏是我當前如何做一個片段:

public class SalesUtil { 

    public static void processSales() { 

     Scanner keyboard = new Scanner(System.in); 

     System.out.println("Enter sales file name: "); 
     String salesFile = keyboard.nextLine(); 

     try { 

     Scanner scanFile = new Scanner(new File(salesFile)); 

     //do stuff 
     } 
     } catch(FileNotFoundException fnfe) { 

     System.out.println("Invalid file name supplied, please try again."); 
     processSales(); 
     } 
    } 
} 
do stuff部分

嗯,我計算值和打印數據到控制檯。如果我在第一次嘗試時正確輸入正確的文件名,則所有數據都是正確的。如果數據不正確一次或多次不正確。

我想這是因爲在我的初始堆棧頂部添加了函數調用,並且在提供後續堆棧調用之前從不'出去'初始堆棧,直到提供了正確的文件爲止?

我對java還是一個新東西,並希望瞭解如何使用異常來解決此問題的一些提示。

+0

這個問題太廣,通常回答,但你說得對,遞歸重新調用是一個壞主意。相反,將'scanner'變量放在方法的作用域中,將其設置在'try'塊中,並設置一個'(while scanner == null)'循環來包含提示和文件打開嘗試。 – chrylis

回答

1

FileNotFoundException是正確的,但是我認爲你擔心堆棧堆積?我測試了多次失敗嘗試後讀迴文件,它很好。遞歸調用在方法的末尾,因此它是代碼的最後一行,因此堆棧不應該有任何影響。

但是,如果你願意,你可以使用while循環而不是遞歸,避免棧集結:

public static void processSales() { 

    Scanner scanFile = null; 
    Scanner keyboard = new Scanner(System.in); 

    while (scanFile == null) { 

     System.out.println("Enter sales file name: "); 
     String salesFile = keyboard.nextLine(); 

     try { 
      scanFile = new Scanner(new File(salesFile)); 

      while (scanFile.hasNextLine()) { 
       System.out.println(scanFile.nextLine()); 
      } 
     } catch(FileNotFoundException fnfe) { 
      System.out.println("Invalid file name supplied, please try again."); 
     } 
    } 
} 
1

使用file.exist()方法來檢查,如果你想要做的是,以確保它存在,那麼這是代碼:

File sfile = new File(salesFile); 
if (sfile.exists()) { 
    // ok, file exist do something. 
    ... 
} 

在另一方面,當你說「無效文件」可以是任何東西,如果它是壞的文件名,那麼它是另一種動物(當然,不同的exeception)...

使用try/catch語句爲只讀文件,則:

try { 
    FileInputStream sfile = new FileInputStream(salesFile); 
    ... 
} catch (FileNotFoundException e) { 
    System.out.println(e.getMessage()); 
} 
+1

'我的教授說我們應該用一個例外來處理這個問題。' –

+0

好吧,我現在得到了你。它是你想要的FileInputStream。因爲它是輸入,它只會對現有的進行打開,所以如果文件不存在,你的構造會導致FileNotFoundException。 –

相關問題