2015-10-15 200 views
-3

我有以下代碼。異常處理?

using System; 
using System.IO;       

class ExceptionHandling 
{ 
    public static void Main() 
    { 
     StreamReader streamReader = null; 
     try 
     { 
     streamReader = new StreamReader("C:\\Sample Files\\Data.txt");  
     Console.WriteLine(streamReader.ReadToEnd());        
     } 

     catch(FileNotFoundException ex)           
     {  
      Console.WriteLine("Please check if the file {0} exists",ex.FileName); 
     } 
     catch(Exception ex) 
     { 
      Console.WriteLine(ex.Message); 
     } 
     finally 
     { 
      if (streamReader !=null)     
      { 
      streamReader.Close(); 
      } 
      Console.WriteLine("FInally Block"); 
     } 
    } 
} 

我的問題如下:

1)StreamReader streamReader = null;爲什麼StreamReader的分配爲空?

2)streamReader = new StreamReader我只是想澄清一下。 StreamReader引用變量是否指向StreamReader對象?

3)如果streamReader = new StreamReader("C:\\Sample Files\\Data.txt");發生異常,streamReader是否仍然打開?

4)既然我們寫了StreamReader streamReader = null;不是streamReader總是爲null,因此在Finally塊中不可能關閉嗎?

5)我不知道FileNotFoundException exException ex是如何工作的。是不是ex對象引用變量,並且只有當我們將它們分配給諸如Exception ex = new Exception之類的對象時,它纔會起作用?

+7

問題太多。閱讀文檔和C#圖書的良好開端是您應該開始的地方。 –

回答

3
  1. 這種說法意味着,以後,如果你想檢查的StreamReader被正確打開,你可以做streamReader == null

  2. 此實例StreamReader對象的一個​​新實例從一個路徑。

  3. 否streamReader不會打開並引發異常。

  4. 在finally塊中,如果發生異常,並且如果沒有發生異常,將會運行。因此,處理任何分配的系統資源非常重要。

  5. FileNotFound在打開streamReader時拋出,但是異常ex是任何其他異常的一般情況。

在StreamReader的一些一般信息它是從System.IO.Stream對象繼承的類(具有類似的性質)。它在實例化時分配系統資源,並聲明自己正在讀取某個流(在這種情況下是文件流)。因此,如果您實例化streamReader,則需要關閉它,以便其他應用程序可以訪問該資源。

它阻止其他應用程序讀取資源的原因是爲了防止發生多線程問題,即一個應用程序讀取文檔,程序員假定文檔在程序打開文檔時以及關閉時間之間不變它。如果有其他程序出現並更改了某些文本,則原始程序可能會崩潰並導致藍屏死機。

+0

就像你說的那樣,如果streamReader不會打開並拋出異常,爲什麼我們不得不在finally塊中關閉它? – jelly

+2

如果沒有拋出異常,你仍然需要處理streamReader – Cjen1

+0

Cjen 1非常感謝。我一直在學習教程,所以沒有關於處理streamReader和資源等方面的任何信息。請告訴我他們是什麼。 – jelly

2
  1. 這只是streamReader變量初始化爲null。如果您沒有初始化該值,則會在fianally塊中發現有關使用未初始化變量的編譯器錯誤。

  2. 是的。

  3. 不,但有可能StreamReader構造函數會成功,但streamReader.ReadToEnd()的調用將拋出異常。在這種情況下,您將有一個開放的streamReader

  4. 不,請參閱上述答案。

  5. 不同的catch塊允許您處理不同類型的錯誤。只有一個catch塊會處理任何給定的異常。 C#將找出您處理的最具體的異常,並確保您輸入該塊。異常(ex)的實際實例將被構造並由框架傳遞給塊。你不需要做任何明確的事情。

+0

非常感謝您的回答。這真的很有幫助,但在答案3中,可以解釋StreamReader構造函數何時會成功,但是對streamReader.ReadToEnd()的調用會拋出異常? – jelly

+0

@jelly - 如果您查看該方法的文檔,那麼有一個「Exceptions」部分,可以準確告訴您某個方法可能拋出哪些異常以及原因是什麼:https://msdn.microsoft.com/en-us /library/system.io.streamreader.readtoend(v=vs.110).aspx –