![](/img/trans.png)
[英].ToString() does not raise an exception on double? or long? while it will raise an exception on null string
[英]why does this raise a null object exception
我收到未設置為對象實例的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; }
}
將復雜對象初始化更改為以下形式:
var result = new OrderDataDriver();
result.blablah = foor.bar;
然后,您將獲得更好的錯誤消息,其中包含您嘗試訪問null對象的屬性的確切行號。
這里是參考這種可愛模式的好地方,它使開發人員的生活更輕松http://en.wikipedia.org/wiki/Fail-fast
如果該屬性為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,
由於可能已經為null
已經被記錄,因此應該早些捕獲它們。
除非您有帶有副作用的吸氣劑。 那些純屬邪惡,所以要當心。 另一種可能性是另一個線程更改了一個值。 這甚至更難以證明。
當您使用對象初始化程序時,例如
result = new OrderDataDriver { OrderId = order.Id, Address = order.Location.Address, Lat = order.Location.Latitude, Lng = order.Location.Longitude, };
不要期望行號(如果有的話,還有列號)會准確指出括號{ }
哪個“屬性分配”會導致異常。 畢竟,這將轉換為對臨時(不可見)變量的屬性的分配。 只有一切順利,臨時變量才會復制到您的result
值中。
我還經歷了涉及對象初始化程序的堆棧跟蹤帶來的不便。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.