2012-09-27 84 views
2

我收到運行時錯誤「SensionVB.CommonCall的類型初始值設定項引發異常。」試圖實例化對象呼叫時:對象的類型初始值設定項引發異常

Dim general As New SensionVB.CommonCall 

當單步調試代碼,一旦打在上面一行代碼和失敗,它的作用。

從微軟的建議是檢查null,或增加新的既不在這種情況下是真的

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 = "[email protected]" 
Public Sub Initialize() 
    oConnection.Open() 
End Sub 
+2

看看內部異常。 – SLaks

+0

未將對象引用設置爲對象的實例。 – Sean

+1

請顯示CommonCall類的靜態構造函數('Shared Sub New')的代碼 – jeroenh

回答

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文檔:

究竟何時共享構造函數運行主要是依賴於實現的,但幾個保證是如果明確定義了共享構造函數:

  • 共享構造函數在任何i創建類類型的實例。
  • 共享構造函數在結構類型的任何實例成員被訪問之前,或者在顯式調用任何結構類型的構造函數之前運行。調用爲結構創建的隱式無參構造函數不會導致共享構造函數運行。
  • 在引用任何類型的共享成員之前運行共享構造函數。
  • 共享構造函數在加載從類型派生的任何類型之前運行。
  • 共享構造函數在程序的單次執行過程中不會運行多次。

9.3.2 Shared Constructors

你可能會發現,創造一個初始化共享領域的共享構造函數:

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 

這不會解決你的問題,最有可能的,但它可能更容易找到並處理(空字符串等)

+0

不確定這是否因爲它在實例化呼叫時失敗。當代碼看到調用時,我已經通過了它,它會拋出錯誤,它永遠不會進入類本身。 – Sean

+0

共享值在第一次實例化之前評估一次。在調試器到達構造函數之前會發生該錯誤。 – JDB

+0

@Sean - 請參閱最新的答案。我已經添加了一些關於共享構造函數的信息,這些信息可能有用/有用。 – JDB

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 
+0

相信我只是糟糕的實踐,只是冰山一角。總的來說,這是一個在IIS中工作的網站,但不能在Visual Studio中編譯。我的工作IDs清理它。第一階段是編譯它,第二階段的重構就像一個瘋子。階段3 ...階段4利潤 – Sean

相關問題