2013-12-19 73 views
1

好的,這會有點長。所以我做了一個junit測試課來測試我的程序。我想測試,如果使用一個掃描器讀取一個文件到該程序的方法拋出和異常,如果該文件不存在這樣的:file.delete()不會刪除文件,java

@Test 
public void testLoadAsTextFileNotFound() 
{ 
    File fileToDelete = new File("StoredWebPage.txt"); 

    if(fileToDelete.delete()==false) { 
     System.out.println("testLoadAsTextFileNotFound - failed"); 
     fail("Could not delete file"); 
    } 

    try{  
     assertTrue(tester.loadAsText() == 1); 
     System.out.println("testLoadAsTextFileNotFound - passed"); 
    } catch(AssertionError e) { 
     System.out.println("testLoadAsTextFileNotFound - failed"); 
     fail("Did not catch Exception"); 

    } 
} 

但在「無法刪除文件」測試失敗,所以我做了一些搜索。路徑是正確的,我有權訪問該文件,因爲程序首先完成了它。所以唯一的其他選擇是,文件的流或者來自文件的流仍在運行。所以我檢查了該方法,以及使用該文件的另一種方法,並且儘可能將兩個流在方法內關閉。

protected String storedSite; //an instance variable 
/** 
* Store the instance variable as text in a file 
*/ 
public void storeAsText() 
{ 
    PrintStream fileOut = null; 
    try{ 
     File file = new File("StoredWebPage.txt"); 
     if (!file.exists()) { 
      file.createNewFile(); 
     } 

     fileOut = new PrintStream("StoredWebPage.txt"); 
     fileOut.print(storedSite); 
     fileOut.flush(); 
     fileOut.close(); 

    } catch(Exception e) { 
     if(e instanceof FileNotFoundException) { 
      System.out.println("File not found"); 
     } 
     fileOut.close(); 
    } finally { 
     if(fileOut != null) 
      fileOut.close(); 
    } 
} 

/** 
* Loads the file into the program 
*/ 
public int loadAsText() 
{ 
    storedSite = ""; //cleansing storedSite before new webpage is stored 
    Scanner fileLoader = null; 
    try { 
     fileLoader = new Scanner(new File("StoredWebPage.txt")); 
     String inputLine; 
     while((inputLine = fileLoader.nextLine()) != null) 
      storedSite = storedSite+inputLine; 
     fileLoader.close(); 
    } catch(Exception e) { 
     if(e instanceof FileNotFoundException) { 
      System.out.println("File not found"); 
      return 1; 
     } 
     System.out.println("an Exception was caught"); 
     fileLoader.close(); 
    } finally { 
     if(fileLoader!=null) 
      fileLoader.close(); 
    } 

    return 0; //return value is for testing purposes only 
} 

我沒有想法。爲什麼我不能刪除我的文件?

編輯:我編輯的代碼,但是這仍然給我同樣的問題:S

+1

也許不完全是您的問題,但您確定在您的代碼中沒有發生除FileNotFoundException之外的其他異常嗎?例如關閉流等問題。因爲捕獲所有異常並只處理FileNotFoundException拋出所有其他異常而不讓你知道,所以發生任何問題。 –

+1

還請記住,Windows不會讓您刪除任何進程打開的任何文件。 – chrylis

回答

3

這裏有兩個問題。第一個是,如果一個異常被你寫入文件過程中引發的,輸出流沒有關閉(同爲讀):

try { 
    OutputStream someOutput = /* a new stream */; 

    /* write */ 

    someOutput.close(); 

第二個問題是,如果有異常,你不會收到通知:

} catch (Exception e) { 
    if (e instanceof FileNotFoundException) { 
     /* do something */ 
    } 

    /* else eat it */ 
} 

所以這個問題幾乎可以肯定的是,其他的異常正在拋出,你不知道它。

'正確' 的成語來關閉流如下:

OutputStream someOutput = null; 
try { 
    someOutput = /* a new stream */; 

    /* write */ 

} catch (Exception e) { 
    /* and do something with ALL exceptions */ 

} finally { 
    if (someOutput != null) someOutput.close(); 
} 

或者在Java 7中,你可以使用try-with-resources

+0

並始終打印和/或記錄堆棧跟蹤。 – chrylis

+0

我編輯了代碼,但仍然沒有解決問題編輯:我忘記在storeastext上打印所有其他異常的東西,那就是問題所在。它拋出了另一個異常 – Tomas0206

+0

什麼是例外?用e.printStackTrace()打印堆棧跟蹤;像@chrylis建議的那樣。另外請記住,您不必在catch塊中關閉。這就是最後一塊的目的。 – Radiodef

相關問題