2009-06-07 62 views
2
 I have the following code: 


     try 
     { 
      FileStream FS = new FileStream(this.InFile, FileMode.Open, FileAccess.Read); 
      return ""; 
     } 
     catch (FileNotFoundException ex) 
     { 
      return ex.Message; 
     } 

     finally 
     { 
      FS.Close(); 
      FS.Dispose(); 
     } 

但是當我編譯它時,我得到一個錯誤,說:名稱'FS'在當前上下文中不存在。變量在當前上下文中不存在

所以我把一個FileStream聲明頂部這樣

 FileStream FS; 
     try 
     { 
      FileStream FS = new FileStream(this.InFile, FileMode.Open, FileAccess.Read); 
      return ""; 
     } 
     catch (FileNotFoundException ex) 
     { 
      return ex.Message; 
     } 

     finally 
     { 
      FS.Close(); 
      FS.Dispose(); 
     } 

的嘗試..catch塊之前,但我編譯時得到一個錯誤,使用未賦值的變量FS和它所指向的最後塊。

現在我明白這兩個錯誤,爲什麼我得到他們,但我不知道如何編碼,以便我嘗試代碼並捕獲錯誤,如果有的話。

任何幫助將不勝感激 - 謝謝!

回答

8

如果拋出FileNotFoundException會發生什麼?然後你會看到finally子句(FS.Close()和FS.Dispose()),但是FS沒有初始化!你應該做的是初始化FS爲null,終於子句中添加一個if語句檢查FS不爲空

FileStream FS = null; 
    try 
    { 
     FS = new FileStream(this.InFile, FileMode.Open, FileAccess.Read); 
     return ""; 
    } 
    catch (FileNotFoundException ex) 
    { 
     return ex.Message; 
    } 

    finally 
    { 
     if (FS != null) { 
      FS.Close(); 
      FS.Dispose(); 
     } 
    } 
-1

FS在try塊的範圍聲明,所以它不存在之外的塊。

正確的代碼是:

FileStream FS = null; 
    try 
    { 
     FS = new FileStream(this.InFile, FileMode.Open, FileAccess.Read); 
     return ""; 
    } 
    catch (FileNotFoundException ex) 
    { 
     return ex.Message; 
    } 

    finally 
    { 
     if (FS != null) 
     { 
      FS.Close(); 
      FS.Dispose(); 
     } 
    } 

此代碼是不是最優的(參見馬克的答案的最佳解決方案)。這段代碼是一個簡單的原因,原來代碼沒有編譯爲例(不改變原有代碼的結構)

+0

這不會編譯,這個事實甚至在原來的文章中已經提到。 – 2009-06-07 09:57:16

10

對方回覆已經覆蓋爲什麼(範圍界定和明確賦值) - 但你使生活艱苦...

try { 
    using(FileStream FS = new FileStream(
     this.InFile, FileMode.Open, FileAccess.Read)) 
    { 
     return ""; 
    } 
} catch (FileNotFoundException ex) { 
    return ex.Message; 
} 
相關問題