2013-01-21 37 views
2

我得到不設置到object.:OperatorAssembly實例的對象引用:0線157.我不明白是什麼可能會引發此異常爲什麼會發生這種提高空對象異常

LogFile.Info("order="+order.Id); 

if (order.Location != null) 
{ 
    LogFile.Info("order=" + order.Location.Address); 
}  
else 
{ 
    LogFile.Info("order location is null"); 
} 

LogFile.Info("order=" + order.Location.Latitude); 
LogFile.Info("order=" + order.IsResolved); 
LogFile.Info("order user id=" + order.User.Id); 
LogFile.Info("order ser name=" + order.User.Name); 
LogFile.Info("order ser dest =" + order.Destination.Address);      

line 157: 
result = new OrderDataDriver 
{ 
    OrderId = order.Id, 
    Address = order.Location.Address, 
    Lat = order.Location.Latitude, 
    Lng = order.Location.Longitude, 
    DestinationAddress = order.Destination.Address, 
    DestinationLat = order.Destination.Latitude, 
    DestinationLng = order.Destination.Longitude, 
    IsCanceled = order.IsCanceled, 
    IsPendingResponse = order.IsPendingResponse, 
    IsResolved = order.IsResolved, 
    UserId = order.User.Id, 
    Message = order.MessageForDriver, 
    UserName = order.User.Name, 
    // IsAdvanceBooking = order.AdvenceBookingTime != null, 
    AdvanceBookingTime = order.AdvenceBookingTime, 
    AdvancePrice = order.CalculatedPrice, 
    AdvanceDistance = order.CalculatedDistance, 
    SecondsToRespond = 30, 
    Status=order.DriverStatus 
}; 

[DataContract] 
public class OrderDataDriver 
{ 

    [DataMember] public string Address { get; set; } 
    [DataMember] public string Feedback { get; set; } 
    [DataMember] public double Lat { get; set; } 
    [DataMember] public double Lng { get; set; } 
    [DataMember] public int UserId { get; set; } 
    [DataMember] public string Status { get; set; } 
    [DataMember] public bool? IsEligible { get; set; } 
    [DataMember] public bool? IsCanceled { get; set; } 
    [DataMember] public bool? IsResolved { get; set; } 
    [DataMember] public bool? IsPendingResponse { get; set; } 
    [DataMember] public bool? AllowsTracking { get; set; } 
    [DataMember] 
    public int OrderId { get; set; } 
    [DataMember] 


    public int App { get; set; } 
    [DataMember] 
    public int? PreferedDriver { get; set; } 
    [DataMember] 
    public bool IsAdvanceBooking { get; set; } 
    [DataMember] 
    public DateTime? AdvanceBookingTime { get; set; } 
    [DataMember] 
    public double? AdvancePrice { get; set; } 
    [DataMember] 
    public double? AdvanceDistance { get; set; } 
    [DataMember] 
    public string DestinationAddress { get; set; } 
    [DataMember] 
    public double DestinationLat { get; set; } 
    [DataMember] 
    public double DestinationLng { get; set; } 
    [DataMember] 
    public string Message { get; set; } 
    [DataMember] 
    public string UserName { get; set; } 
    [DataMember] 
    public int SecondsToRespond { get; set; } 
} 
+1

你是通過代碼來看看它認爲是空的嗎?日誌輸出顯示爲這些字段的值是什麼? –

+0

您是否100%確定錯誤的行號?您是否在發現錯誤後添加了日誌記錄(這會改變您的行號?您使用的是最新版本嗎? –

回答

4

變化的複雜對象初始化是這樣的:

var result = new OrderDataDriver(); 
result.blablah = foor.bar; 

然後,您將得到一個更好的錯誤消息,其中包含您嘗試訪問空對象的屬性的確切行號。

這裏是一個參考,這個可愛的圖案,這使得開發人員更容易 http://en.wikipedia.org/wiki/Fail-fast

+1

同意,這種初始化使調試對於任何不止一個屬性都是可怕的。而且很醜。 –

+0

好吧,我試了一下,導致這個問題的線路是result.SecondsToRespond = 30 ;.我不知道爲什麼 – Ryan

+0

這意味着如果你評論這一行,沒有例外會被拋出? –

0

任何這些訪問的人能炸燬如果屬性爲null:

//If Location is null BOOM!!! 
Lat = order.Location.Latitude, 
Lng = order.Location.Longitude, 

//If Destination is null BOOM!!! 
DestinationAddress = order.Destination.Address, 
DestinationLat = order.Destination.Latitude, 
DestinationLng = order.Destination.Longitude, 
+1

是的,但它在到達該行前應該會炸燬 –

+0

也許我不相信他的錯誤消息:)代碼並不完全按照...所以我假設它被粘貼來自多個來源的大雜燴。 – Josh

0

的壽命,因爲事情會是null已經被記錄,他們應該更早抓的好地方。

除非你有一個帶有副作用的屬性getter。那些是純粹的邪惡,所以要小心。另一種可能是另一個線程改變了一個值。這很難證明。

+0

不應該有任何多線程問題,這是非常奇怪的... ... - – Ryan

0

當你使用一個對象初始化,像

result = new OrderDataDriver { OrderId = order.Id, Address = order.Location.Address, Lat = order.Location.Latitude, Lng = order.Location.Longitude, }; 

不要指望行號(如果您有列數)準確指出其中括號{ }裏面的「財產分配」的導致例外。畢竟這被轉換爲賦值給臨時(不可見)變量的屬性。只有一切順利,臨時變量纔會被複制到您的result值。

我也遇到過涉及對象初始值設定項的堆棧跟蹤帶來的不便。

相關問題