为什么静态构造函数在引用时抛出异常 另一个类中的const字符串。
class MyClass
{
static MyClass()
{
ExamineLog();
}
static ExamineLog()
{
FilePath = HttpContext.Current.Server.MapPath(Helper.LogConfiguration);
}
}
class Helper
{
public const string LogConfiguration= "\rootpath\counters.txt";
}
抛出的异常是未将对象引用设置为对象的实例。堆栈跟踪指向尝试读取常量值的行。有什么想法吗?
答案 0 :(得分:6)
思想:
HttpContext
可能为null HttpContext.Current
可能为null HttpContext.Current.Server
可能为null 进一步的想法:
Current
是HttpContext
类的静态属性,因此HttpContext
不是对象引用,并且不能为null。如果您想简化调试,可以像这样更改代码(我假设ExamineLog
应该被声明为void方法):
static void ExamineLog()
{
var context = HttpContext.Current;
var server = context.Server;
FilePath = server.MapPath(Helper.LogConfiguration);
}
答案 1 :(得分:0)
我的第一个赌注是一个糟糕的字符串...
"\rootpath\counters.txt" // => "\r" is carriage return
所以MapPath失败了。
答案 2 :(得分:0)
我的猜测是HttpContext.Current在静态构造函数的上下文中为null。自从我在ASP.NET中陷入困境已经有一段时间了,但是IIRC,HttpContext.Current将不会被设置,除非你处于页面的请求 - 响应生命周期中。我不知道什么时候静态构造函数必须在ASP.NET应用程序中执行(从技术上讲,应该是在第一次通过代码访问时),在您的情况下,它可以很容易地处于此页面生命周期之外的上下文中。
我怀疑null引用是来自你的const引用:const引用是在编译时作为文字值/字符串插入的,所以不应该抛出运行时空引用异常。