2

オブジェクトのインスタンスに設定されていないオブジェクト参照を取得します。: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; }
}
4

4 に答える 4

4

複雑なオブジェクトの初期化を次のように変更します。

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

次に、nullオブジェクトのプロパティにアクセスしようとした正確な行番号を含むより適切なエラーメッセージが表示されます。

ここは、開発者の生活を楽にするこの素敵なパターンを参照するのに適した場所です http://en.wikipedia.org/wiki/Fail-fast

于 2013-01-21T21:41:14.930 に答える
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,
于 2013-01-21T21:39:24.160 に答える
0

nullすでにログに記録されている可能性があるものは、もっと早くキャッ​​チされているはずです。

副作用のあるプロパティゲッターがない限り。それらは純粋な悪なので、気をつけてください。別の可能性は、別のスレッドが値を変更したことです。それを証明するのはさらに難しいです。

于 2013-01-21T21:44:58.323 に答える
0

次のようなオブジェクト初期化子を使用する場合

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

{ }中括弧内の「プロパティ割り当て」のどれが例外につながるかを正確に示す行番号(およびある場合は列番号)を期待しないでください。結局、これは一時的な(見えない)変数のプロパティへの割り当てに変換されます。すべてがうまくいった場合にのみ、一時変数が値にコピーされますresult

また、オブジェクト初期化子を含むスタックトレースでこの不便を経験しました。

于 2013-01-21T22:25:18.390 に答える