0

この方法:

private async Task readFileInfo(string folderId)

別のメソッドへの呼び出しがあります:

importCount = await VM.importVehicles(myXDoc);

ここで定義: (注: for ループから for each に変更しましたが、同様の結果が得られます)。

public async Task<Int32> importVehicles(XDocument importXMLDocument)
{
    var Importedvehicles = from vehicle in importXMLDocument.Descendants("vehicle")
                           select new
                           {
                               VehicleName = vehicle.Element("VehicleName").Value,
                               VehicleYear = vehicle.Element("VehicleYear").Value,
                               Odometer = vehicle.Element("Odometer").Value,
                               LicensePlate = vehicle.Element("LicensePlate").Value,
                               OilWeight = vehicle.Element("OilWeight").Value,
                               OilQuantity = vehicle.Element("OilQuantity").Value,
                               OilFilterModelNumber = vehicle.Element("OilFilterModelNumber"),
                               AirFilterModelNumber = vehicle.Element("AirFilterModelNumber"),
                               OilChangedDate = vehicle.Element("OilChangedDate"),
                               OilChangedOdometer = vehicle.Element("OilChangedOdometer"),
                               NextOilChangeDate = vehicle.Element("NextOilChangeDate"),
                               NextOilChangeOdometer = vehicle.Element("NextOilChangeOdometer"),
                               SettingDistance = vehicle.Element("SettingDistance"),
                               SettingMonths = vehicle.Element("SettingMonths"),
                           };

    Int32 vehicleId;
    vehicleId = await getMaxVehicleId();
    try
    {

        foreach (var item in Importedvehicles)
        {
            vehicle myImportedVehicle = new vehicle();
            myImportedVehicle.VehicleId = vehicleId += 1;
            myImportedVehicle.ImagePath = "Assets/car2.png";
            myImportedVehicle.VehicleName = item.VehicleName;
            myImportedVehicle.VehicleModel = item.VehicleName;


            myImportedVehicle.VehicleYear = short.Parse(item.VehicleYear);
            myImportedVehicle.CurrentOdometer = Convert.ToInt32(item.Odometer);
            myImportedVehicle.LicensePlate = item.LicensePlate;
            myImportedVehicle.LastOilChangedDate = Convert.ToDateTime(item.OilChangedDate.Value.ToString()).ToString("d");
            myImportedVehicle.LastOilChangedOdometer = (Int32)item.OilChangedOdometer;
            myImportedVehicle.ReminderDistance = (Int32)item.SettingDistance;
            myImportedVehicle.ReminderMonths = (Int32)item.SettingMonths;

            vehicleInformation myImportVI = new vehicleInformation();
            myImportVI.OilWeight = item.OilWeight;
            myImportVI.OilAmount = item.OilQuantity;
            myImportVI.OilFilterNumber = item.OilFilterModelNumber.Value.ToString();
            myImportVI.AirFilterNumber = item.AirFilterModelNumber.Value.ToString();

            myImportedVehicle.vehicleInfo = myImportVI;
            m_vehicles.Add(myImportedVehicle);
        }
    }
    catch (Exception ex)
    {
        System.Diagnostics.Debug.WriteLine(ex.Message.ToString());
    }

        await SaveList();
        return Importedvehicles.Count();
    }

エラーが発生します:

オブジェクト参照がオブジェクト インスタンスに設定されていません。

ステップスルーするiVehicleと強調表示されますが、forステートメントに直接移動します。iVehicleその後、まだ結果を取得していないため、エラーが発生します。

4

2 に答える 2

1

これはあなたの質問に 100% 答えているわけではありませんが、良いスタートを切れるはずです。

for...loopデバッガーが の宣言の後に直接ジャンプする理由は、宣言iVehicleしたときにクエリが実行されないためです。したがって、その時点での iVehicle は匿名型のコレクションではありません。

を呼び出す.Count()と、クエリが実行されiVehicle、匿名型の適切なコレクションに変換されようとしています。ただし、( を呼び出した後に実行される.Count())クエリ内の何かが であるためnull、 を受け取っていNullReferenceExceptionます。

importXMLDocumentとの呼び出しからの戻り値の両方Descendants()が null でないことを確認することから始める必要があります。

とにかく役立つことを願っています。

編集:

完全な例を示したので、潜在的にnull.

これを使用するたびに:

vehicle.Element("SomeElementNameHere")

それは潜在的に可能性がありますnull。次に、オブジェクトの.Valueプロパティを呼び出しています。null

各要素が確実に存在することを確認する必要があります。それぞれのケースを分離し、どれがnull.

于 2013-02-15T02:07:07.130 に答える