{"record":{"id":"2eadda3f938aa13e","repo":"dotnet/machinelearning","slug":"training-data-cannot-be-null","errorCode":null,"errorMessage":"Training data cannot be null","messagePattern":"Training data cannot be null","errorType":"validation","errorClass":"ArgumentNullException","httpStatus":null,"severity":"critical","filePath":"src/Microsoft.ML.AutoML/Utils/UserInputValidationUtil.cs","lineNumber":73,"sourceCode":"            if (numberOfCVFolds <= 1)\n            {\n                throw new ArgumentException($\"{nameof(numberOfCVFolds)} must be at least 2\", nameof(numberOfCVFolds));\n            }\n        }\n\n        public static void ValidateSamplingKey(string samplingKeyColumnName, string groupIdColumnName, TaskKind task)\n        {\n            if (task == TaskKind.Ranking && samplingKeyColumnName != null && samplingKeyColumnName != groupIdColumnName)\n            {\n                throw new ArgumentException($\"If provided, {nameof(samplingKeyColumnName)} must be the same as {nameof(groupIdColumnName)} for Ranking Experiments\", samplingKeyColumnName);\n            }\n        }\n\n        private static void ValidateTrainData(IDataView trainData, ColumnInformation columnInformation)\n        {\n            if (trainData == null)\n            {\n                throw new ArgumentNullException(nameof(trainData), \"Training data cannot be null\");\n            }\n\n            if (DatasetDimensionsUtil.IsDataViewEmpty(trainData))\n            {\n                throw new ArgumentException(\"Training data has 0 rows\", nameof(trainData));\n            }\n\n            foreach (var column in trainData.Schema)\n            {\n                if (column.Name == DefaultColumnNames.Features && column.Type.GetItemType() != NumberDataViewType.Single)\n                {\n                    throw new ArgumentException($\"{DefaultColumnNames.Features} column must be of data type {NumberDataViewType.Single}\", nameof(trainData));\n                }\n\n                if ((column.Name != columnInformation.LabelColumnName &&\n                    column.Name != columnInformation.UserIdColumnName &&\n                    column.Name != columnInformation.ItemIdColumnName &&\n                    column.Name != columnInformation.GroupIdColumnName)","sourceCodeStart":55,"sourceCodeEnd":91,"githubUrl":"https://github.com/dotnet/machinelearning/blob/7b76e69cf964daeca3f1377af6bc5543284d56c6/src/Microsoft.ML.AutoML/Utils/UserInputValidationUtil.cs#L55-L91","documentation":"Thrown by UserInputValidationUtil.ValidateTrainData when the training IDataView passed to an AutoML experiment is null. The library requires a non-null training dataset to run any experiment and reports the failure via ArgumentNullException naming the trainData parameter.","triggerScenarios":"Calling experiment.Execute(null, ...) or ValidateExperimentExecuteArgs with trainData = null, typically when a data-loading step returned null.","commonSituations":"LoadFromTextFile or a custom loader returning null after a failed read; a lazily-initialized dataset variable never assigned; refactoring that removed data loading but left the Execute call in place.","solutions":["Load a valid IDataView before calling Execute (e.g. mlContext.Data.LoadFromTextFile<T>(path))","Add a null check on the training data before invoking the experiment","Fix the upstream data-loading code that silently returned null"],"exampleFix":"// before\nIDataView trainData = LoadData(); // may return null\nvar result = experiment.Execute(trainData, labelColumnName, \"A\");\n\n// after\nIDataView trainData = LoadData() ?? mlContext.Data.LoadFromTextFile<ModelInput>(dataPath, hasHeader: true, separatorChar: ',');\nif (trainData == null) throw new InvalidOperationException(\"No training data loaded\");\nvar result = experiment.Execute(trainData, labelColumnName, \"A\");","handlingStrategy":"type-guard","validationCode":"if (trainData is null) throw new InvalidOperationException(\"trainData must be loaded before Execute\");","typeGuard":"static bool HasTrainingData(IDataView d) => d is not null && d.GetRowCursor(d.Schema).MoveNext();","tryCatchPattern":"try { var r = experiment.Execute(trainData, label, \"A\"); }\ncatch (ArgumentNullException ex) when (ex.ParamName == \"trainData\") { /* load default dataset and retry once */ }","preventionTips":["Never let data-loading helpers return null; throw early inside the loader","Load data immediately before Execute in the same method","Use nullable reference types (IDataView?) so the compiler flags null flows"],"tags":["dotnet","mlnet","automl","null-argument","training-data"],"backgroundTag":"null-argument","analyzedSha":"7b76e69cf964daeca3f1377af6bc5543284d56c6","analyzedAt":"2026-09-11T12:35:38.930Z","contentChangedAt":"2026-09-11T12:35:38.930Z","schemaVersion":2},"datasetVersion":"2026-09-14T05:17:10.506Z"}