对象的类型初始值设定项引发了异常

时间:2012-09-27 15:57:05

标签: vb.net class initialization

我收到运行时错误“'SensionVB.CommonCall'的类型初始化程序引发异常。”在尝试实例化对象调用时:

Dim general As New SensionVB.CommonCall

当代码在代码中遇到上述行时单步执行并失败,它就会执行。

Microsoft的建议是检查null,或者在这种情况下添加new也不是

SensionVB =项目 CommonCall =具有各种功能的公共类

Public Class CommonCall
Protected WithEvents litOne As System.Web.UI.WebControls.Literal
Public Shared sConnection As String = ConfigurationManager.ConnectionStrings("SerialStamperConnectionString").ConnectionString
Public Shared oConnection As New MySqlClient.MySqlConnection(sConnection)
Public Shared sMaxSerialNumber As String = "S000001"
Public Shared bLoggedin As Boolean = False
Public Shared iPageWidth As Integer = 1024

Public Shared isValidPassword As Boolean = False
Public Shared strCompanyID As String = ""
Public Shared strSecurityID As String = ""

Dim Response As New HttpResponse(HttpWriter.Null)
Const TimeOutInMinutes As Integer = 60
Const SiteTitle As String = "SensiOn"
Public Const PageWidth As Integer = 1250
Public SSOenabled As Boolean
Const SuperUserEmails As String = "super@domain.com"
Public Sub Initialize()
    oConnection.Open()
End Sub

2 个答案:

答案 0 :(得分:3)

我看到可能是罪魁祸首的三行:


Public Shared sConnection As String = ConfigurationManager.ConnectionStrings("SerialStamperConnectionString").ConnectionString

这里有几个潜在的问题。一,您的连接字符串名称(“SerialStamperConnectionString”)不正确。如果此名称与web.config中的键不匹配,则它将返回Nothing,当您尝试获取ConnectionString属性的值时会导致NullReferenceException。


Public Shared oConnection As New MySqlClient.MySqlConnection(sConnection)

上面的连接字符串可能未在web.config中正确配置,因此返回Nothing作为ConnectionString。如果sConnection已设置为Nothing,则可能会抛出我的MysqlConnection构造函数的NullReferenceException。


Dim Response As New HttpResponse(HttpWriter.Null)

如果HttpWriter.NullNothing,那么这也可能是您问题的根源(原因与上述相同)。


如果这些建议似乎都没有导致问题,那么我建议发布有关您的问题的更多信息(包括堆栈跟踪)。提供一百万个声誉点不会向我们提供有关您的代码的任何其他信息。


<强>附录
根据共享构造函数的VB文档(以及扩展名,成员):

  

当运行共享构造函数时,实际上主要依赖于实现,但如果明确定义了共享构造函数,则会提供几个保证:

     
      
  • 在创建类类型的任何实例之前运行共享构造函数。
  •   
  • 共享构造函数在访问结构类型的任何实例成员之前运行,或者在显式调用结构类型的任何构造函数之前运行。调用为结构创建的隐式无参数构造函数不会导致共享构造函数运行。
  •   
  • 在引用任何类型的共享成员之前运行共享构造函数。
  •   
  • 在加载从该类型派生的任何类型之前运行共享构造函数。
  •   
  • 在单次执行程序期间,共享构造函数不会运行多次。
  •   
     

9.3.2 Shared Constructors

您可能会发现创建一个用于初始化共享字段的Shared构造函数很有用:

Public Shared sConnection As String
Public Shared oConnection As MySqlClient.MySqlConnection

Shared Sub New()
    Dim l_connectionString = ConfigurationManager.ConnectionStrings("SerialStamperConnectionString")
    If l_connectionString IsNot Nothing Then
        sConnection = l_connectionString.ConnectionString
        oConnection = New MySqlClient.MySqlConnection(sConnection)
    Else
        ' What to do here?
    End If
End Sub

这很可能无法解决您的问题,但它可能更容易找到并处理(空字符串等)

答案 1 :(得分:1)

这一行可能会失败:

Dim Response As New HttpResponse(HttpWriter.Null)

因为它同时被初始化。尝试将其设置为:

Dim Response As HttpResponse = Nothing 

并在代码中初始化它而不是初始化。在那里你也可以检查你是否得到一个空对象。

如果您在共享变量中得到正确的结果,那么您也在做一些初始化:

Public Shared oConnection As New MySqlClient.MySqlConnection(sConnection)

这些不会影响初始化,因为它们是共享的,但这是不好的做法IMO。

而不是Initialize(),为什么不使用New()

Public Sub New()
    'TODO move init. of Response to here.
    'TODO move init. of oConnection to here.
    oConnection.Open() 'TODO error check
End Sub