2012-03-19 57 views
2

爲什麼靜態構造函數在另一個類中引用 常量字符串時會拋出異常。C#構造函數和常量神祕

class MyClass 
{ 
     static MyClass() 
     { 
      ExamineLog(); 
     } 

     static ExamineLog() 
     { 
      FilePath = HttpContext.Current.Server.MapPath(Helper.LogConfiguration);     
     } 
} 

class Helper 
{ 
     public const string LogConfiguration= "\rootpath\counters.txt"; 
} 

拋出的異常是未將對象引用設置爲對象的實例。堆棧跟蹤指向嘗試讀取常量值的行。有什麼想法嗎?

+1

Aaargh!格式化。修理它。 – 2012-03-19 19:10:42

+1

'static ExamineLog()'? – BoltClock 2012-03-19 19:11:22

回答

6

思考:

  • HttpContext可能爲空
  • HttpContext.Current可能爲空
  • HttpContext.Current.Server可能爲空

另外的想法:

Current是的靜態屬性HttpContext類,所以HttpContext不是對象引用,它不能爲空。如果您希望簡化調試,你可以改變這樣的代碼(我假設ExamineLog應該被宣佈爲無效方法):

static void ExamineLog() 
{ 
    var context = HttpContext.Current; 
    var server = context.Server; 
    FilePath = server.MapPath(Helper.LogConfiguration);     
} 
+0

好吧,不要挑剔,但'HttpContext'是一個類,所以它不能是'null'。 – SuperOli 2012-03-19 19:24:56

+1

@SuperOli我剛剛完成編輯答案以反映這一點。 – phoog 2012-03-19 19:25:28

0

我的第一選擇是錯誤的字符串...

"\rootpath\counters.txt" // => "\r" is carriage return 

所以MapPath失敗。

+0

這不會導致NRE。 – 2012-03-19 19:14:21

+0

根據MSDN MapPath不能拋出這樣的異常 – sll 2012-03-19 19:15:49

0

我的猜測是HttpContext.Current在靜態構造函數的上下文中爲null。自從我在ASP.NET中屈膝已經有一段時間了,但是IIRC,除非您處於頁面的請求 - 響應生命週期中,否則HttpContext.Current將不會被設置。我不知道什麼時候靜態構造函數必須在ASP.NET應用程序中執行(技術上說,應該是在第一次被代碼訪問時),並且對於您的情況,它可能很容易位於此頁面生命週期之外的上下文中。

我懷疑空引用來自你的const引用:const引用在編譯時插入爲字面值/字符串,所以不應該引發運行時空引用異常。