如果我有一個拋出FilenotFoundException的方法,因爲我正在使用掃描器對象來讀取文件,如果錯誤實際上被拋出,掃描器對象是否關閉,還是在處理異常時仍然需要這樣做?我知道當我在我的方法中使用try-catch-finally塊寫入來處理異常時,我關閉了scanner對象,但是如果必須在捕獲異常的另一個對象的方法內執行此操作,我將無法訪問掃描儀對象。是在拋出異常時關閉的java掃描程序?
請保持簡單的說明...顯然我是新來的Java(和一般的OO)。
如果我有一個拋出FilenotFoundException的方法,因爲我正在使用掃描器對象來讀取文件,如果錯誤實際上被拋出,掃描器對象是否關閉,還是在處理異常時仍然需要這樣做?我知道當我在我的方法中使用try-catch-finally塊寫入來處理異常時,我關閉了scanner對象,但是如果必須在捕獲異常的另一個對象的方法內執行此操作,我將無法訪問掃描儀對象。是在拋出異常時關閉的java掃描程序?
請保持簡單的說明...顯然我是新來的Java(和一般的OO)。
如果您使用的是像這樣 3210 代碼如果拋出異常,scanner
對象時,它自身不會產生,所以沒必要將其關閉。
但是最好的編碼方式如下。你可以關閉最後的塊。
Scanner scanner=null;
try
{
scanner = new Scanner(new File(path));
//your code here
}
catch(FileNotFoundException e)//either catch or throw out
{
//log it
}
finally
{
if(null !=scanner)
{
scanner.close();
}
}
如果在執行new Scanner(File)
時找不到文件,則底層的FileInputStream
將不會被打開。
在最後塊中關閉掃描器是一種很好的做法。如果掃描儀已關閉,則關閉呼叫將不起作用。
或者您可以嘗試try-with-resources
構造,如果發生某種異常,它將自動關閉資源。
我想你應該關閉掃描儀對象最後塊無論你捕捉異常與否。
假如你這樣做:
Scanner scanner = new Scanner(new File("/file/does/not/exist"));
和構造函數拋出FileNotFoundException
。首先要注意的是,構造函數不返回Scanner
對象。相反,new
表達式將異常終止,並且將不會發生對scanner
的分配。控制最終會在某些處理程序中結束,但由於超出範圍,因此無法參考scanner
。
因此,要回答你的問題:
如果錯誤確實得到投擲,並掃描對象得到封閉,或者我還是得做,當我處理異常?
如果FileNotFoundException
由構造拋出,沒有Scanner
對象close()
...所以你不必關閉它。
但是,根據您編寫代碼的方式,您可能會到達處理程序或代碼塊,而無需知道是否拋出了異常,是否拋出構造函數或構造函數完成後拋出異常。處理這個問題的方式取決於您使用的Java版本。在Java 7之前,這個成語就像@ Sangeeth的答案。對於Java 7和更高版本,你可以這樣寫:
try (Scanner scanner = new Scanner(new File(path))) {
//your code here
} catch (FileNotFoundException e) {
//log it
}
注意「嘗試與 - 資源」的語法有一個隱含的finally
是每個在的開始宣佈(autocloseable)資源的自動調用close()
try
。這可以免除您對在各種可能的成功和失敗情況下關閉資源的繁瑣代碼的責任。
事實上,我們可以把這個層面做得更深一層。 Scanner
構造函數調用FileInputStream
來打開該文件,這就是FileNotFoundException將被拋出的地方。反過來,這將通過調用本地open
方法實際打開文件。如果在這個過程中出現問題(並拋出異常),那麼在允許異常傳播之前,構造者有責任確保釋放任何資源(例如,本地流被關閉)。
它必須以這種方式工作,因爲失敗的構造函數不會返回任何東西,並且他們不能依賴更深層次的東西知道如何釋放特定異常處理程序中的資源。
+1 ..很好回答:) – TheLostMind 2014-10-29 18:05:56
'try-with-resources'似乎是最好的方法,因爲它需要更少的代碼 – superbob 2014-10-29 10:18:35
@superbob它是最好的方法,而不僅僅是「少代碼」:)。 – Tom 2014-10-29 10:22:02