簡體   English   中英

如何解決 Value 不能為 null。 參數名稱:linq 中的源?

[英]How to resolve Value cannot be null. Parameter name: source in linq?

我不知道為什么會出現這種錯誤。 它有時會發生,我懷疑我的代碼在關閉應用程序時仍然有線程在運行。 所以當我再次打開時它發生了。

Value cannot be null.
Parameter name: source
StackTree :
   at System.Linq.Enumerable.Where[TSource](IEnumerable`1 source, Func`2 predicate)
   at Susenas2015.ViewModels.Kuesioner.VMVsen15_KVal.SettingValidationAndRange(List`1 listTextBox, List`1 listCheckBox, TabControl tabControl) in d:\handita\Office\Project\Susenas 2015\Aplikasi Template Survei\Susenas2015\ViewModels\Kuesioner\VMVsen15_KVal.cs:line 430
   at Susenas2015.ViewModels.Kuesioner.VMVsen15_KVal.vSen15_K_Loaded(Object sender, RoutedEventArgs e) in d:\handita\Office\Project\Susenas 2015\Aplikasi Template Survei\Susenas2015\ViewModels\Kuesioner\VMVsen15_KVal.cs:line 846
   at System.Windows.RoutedEventHandlerInfo.InvokeHandler(Object target, RoutedEventArgs routedEventArgs)
   at System.Windows.EventRoute.InvokeHandlersImpl(Object source, RoutedEventArgs args, Boolean reRaised)
   at System.Windows.UIElement.RaiseEventImpl(DependencyObject sender, RoutedEventArgs args)
   at System.Windows.UIElement.RaiseEvent(RoutedEventArgs e)
   at System.Windows.BroadcastEventHelper.BroadcastEvent(DependencyObject root, RoutedEvent routedEvent)
   at System.Windows.BroadcastEventHelper.BroadcastLoadedEvent(Object root)
   at MS.Internal.LoadedOrUnloadedOperation.DoWork()
   at System.Windows.Media.MediaContext.FireLoadedPendingCallbacks()
   at System.Windows.Media.MediaContext.FireInvokeOnRenderCallbacks()
   at System.Windows.Media.MediaContext.RenderMessageHandlerCore(Object resizedCompositionTarget)
   at System.Windows.Media.MediaContext.RenderMessageHandler(Object resizedCompositionTarget)
   at System.Windows.Media.MediaContext.Resize(ICompositionTarget resizedCompositionTarget)
   at System.Windows.Interop.HwndTarget.OnResize()
   at System.Windows.Interop.HwndTarget.HandleMessage(WindowMessage msg, IntPtr wpa`

我的代碼在這里

    private void SettingValidationAndRange(List<TextBox> listTextBox, List<CheckBox> listCheckBox, TabControl tabControl)
        {

            List<string> listNotDeclare = new List<string>();

            foreach (var textB in listTextBox)
            {
                if (textB.Tag != null)
                    break;

                Metadata metadata = ListMetadataKor.Where(
                    x => "text" + x.Field == textB.Name // this line 430

                ).FirstOrDefault();

                if (metadata == null)
                {
                    if (!string.IsNullOrEmpty(textB.Name))
                        listNotDeclare.Add(textB.Name);
                }
                else
                {
                    metadata.TabControl = tabControl;
                    textB.Tag = metadata;
                }

                textB.AddEvents();
                textB.AutomateFocus();

            }

            if (listNotDeclare.Count > 0)
            {
                Clipboard.SetText(string.Join(",", listNotDeclare.ToArray()));
                Dialog.Info("Ada beberapa Metadata tidak ditemukan data sudah dicopy ke clipboard");
            }

        }

當我第一次啟動我的應用程序時,它沒有出現任何錯誤。 當我打開第二個或更多時會發生這種情況。 如果我打開我的應用程序,它會卡在該代碼中。

我該如何解決這個問題? 我很確定我的 Property ListMetadataKor不為null

ListMetadataKor 是我創建的List<Metadata>對象的實例。 它只發生在極少數情況下。 我不知道解決它

更新

這是我在圖像中的代碼在此處輸入圖片說明

我用這個代碼填充ListMetadataKor

BWHelper.Run((s, e) =>
{
    DataTable dataMetaDataKOR = ExcelHelper.GetDataTableFromExcel(
        AppConstants.FILE_METADATA, AppConstants.SHEET_METADATA_KOR
    );

    DataTable dataKonsistensiKOR = ExcelHelper.GetDataTableFromExcel(
         AppConstants.FILE_METADATA, AppConstants.SHEET_KONSISTENSI_KOR
     );

    listKonsistensiKor = Tools.ToolConvert.GetKonsistensi(dataKonsistensiKOR);
    listMetadataKor = Tools.ToolConvert.GetMetadata(dataMetaDataKOR);

    foreach (Metadata metadata in listMetadataKor)
    {
        metadata.Range.ProsesRange();
    }

}, (s, e) =>
{
    try
    {
        kor = new VSEN15_K() { Title = "Validasi Susenas - KOR" };
        kor.DataContext = new VMVsen15_KVal(rtSusenas.MasterRT, kor, this, listKonsistensiKor, listMetadataKor);
        kor.PreviewKeyDown += EventsCollection.EnterAsTabPreviewKeyDown;
        vmHome.HideLoading();
        UpdateMetaDataEntriKOR(RTSusenas.MasterRT);
        kor.ShowDialog();
    }
    catch (Exception Ex)
    {
        vmHome.HideLoading();
        Dialog.Error(Ex);
    }
});

然后我通過我的類的構造函數拋出變量

 public VMVsen15_KVal(
        MasterRT masterRT,
        VSEN15_K vSen15_K,
        IDaftarSusenas vmDaftarRTSusenas,
        List<Konsistensi> listKonsistensiKor,
        List<Metadata> listMetadataKor

        )
    {

        ListArtDetail = new ObservableCollection<ARTDetailVal>();

        this.ListKonsistensiKor = listKonsistensiKor;
        this.ListMetadataKor = listMetadataKor;

我的工具konsistensi是這樣的

public static List<Konsistensi> GetKonsistensi(DataTable dataTable)
{
    List<Konsistensi> listMetadata = new List<Konsistensi>();
    for (int i = 0; i < dataTable.Rows.Count; i++)
    {
        Konsistensi k = new Konsistensi();
        object[] required = new object[] { DBNull.Value, "" };
        k.Field = dataTable.Rows[i][FIELD].ToString();
        if (string.IsNullOrWhiteSpace(k.Field)) continue;
        k.Message = dataTable.Rows[i][MESSAGE].ToString();
        var obj = dataTable.Rows[i][ORDER];
        k.Order = !required.Contains(dataTable.Rows[i][ORDER]) ? Convert.ToInt32(dataTable.Rows[i][ORDER]) : (int?)null;
        k.Page = !required.Contains(dataTable.Rows[i][PAGE]) ? Convert.ToInt32(dataTable.Rows[i][PAGE]) : (int?)null;
        k.Perlakuan = dataTable.Rows[i][PERLAKUAN].ToString();
        k.RelFields = dataTable.Rows[i][RELFIELDS].ToString();
        k.Rule = dataTable.Rows[i][RULE].ToString();

        if (dataTable.Rows[i][LEVEL].ToString().ToUpper() == ("ART"))
            k.LevelKonsistensi = LevelKonsistensi.ART;
        else if (dataTable.Rows[i][LEVEL].ToString().ToUpper() == ("RT"))
            k.LevelKonsistensi = LevelKonsistensi.RT;
        else if (dataTable.Rows[i][LEVEL].ToString().ToUpper() == ("RTWARNING"))
            k.LevelKonsistensi = LevelKonsistensi.RTWarning;
        else if (dataTable.Rows[i][LEVEL].ToString().ToUpper().Contains("ARTWARNING"))
            k.LevelKonsistensi = LevelKonsistensi.ARTWarning;
        else
            k.LevelKonsistensi = LevelKonsistensi.Lain;

        //k.LevelKonsistensi = dataTable.Rows[i][LEVEL].ToString().Contains("ART") ? LevelKonsistensi.ART : LevelKonsistensi.RT;
        if (k.IsEmpty())
            continue;

        listMetadata.Add(k);
    }
    return listMetadata;
}

錯誤消息清楚地表明source參數為null Source 是您正在枚舉的枚舉。 在您的情況下,它是ListMetadataKor對象。 在您第二次過濾時它絕對為null 確保您永遠不會為此列表分配null 只需檢查代碼中對此列表的所有引用並查找分配。

值不能為空。 參數名稱:來源

當您查詢為 null 的集合時,會出現上述錯誤。

為了演示,下面的代碼會導致這樣的異常。

Console.WriteLine("Hello World");
IEnumerable<int> list = null;
list.Where(d => d ==4).FirstOrDefault();

這是上面代碼的輸出。

Hello World 運行時異常(第 11 行):值不能為空。 參數名稱:來源

堆棧跟蹤:

[System.ArgumentNullException:值不能為空。 參數名稱:source] 在 Program.Main():第 11 行

在您的情況下ListMetadataKor為空。 如果你想玩,這里是小提琴。

當您像這樣調用 Linq 語句時:

// x = new List<string>();
var count = x.Count(s => s.StartsWith("x"));

您實際上是在 System.Linq 命名空間中使用擴展方法,因此編譯器將其轉換為:

var count = Enumerable.Count(x, s => s.StartsWith("x"));

因此,您遇到的錯誤是因為第一個參數source (在上面的示例中為x )為空。

System.ArgumentNullException:值不能為空。 參數名稱:值

此錯誤消息不是很有幫助!

您可以通過多種不同方式獲得此錯誤。 錯誤可能並不總是與參數名稱: value 有關 它可以是傳遞給函數的任何參數名稱。

作為解決此問題的通用方法,請查看堆棧跟蹤或調用堆棧:

Test method GetApiModel threw exception: 
System.ArgumentNullException: Value cannot be null.
Parameter name: value
    at Newtonsoft.Json.JsonConvert.DeserializeObject(String value, Type type, JsonSerializerSettings settings)

您可以看到參數名稱valueDeserializeObject的第一個參數。 這讓我檢查了我們反序列化 JSON 字符串的 AutoMapper 映射。 該字符串在我的數據庫中為空。

您可以更改代碼以檢查是否為空。

下面提到的問題以Excel格式導出到Crystal報表中。

System.ArgumentNullException: Value cannot be null.
Parameter name: window
   at System.Windows.Interop.WindowInteropHelper..ctor(Window window)
   at System.Windows.MessageBox.Show(Window owner, String messageBoxText, String caption, MessageBoxButton button, MessageBoxImage icon)
   at SAPBusinessObjects.WPF.Viewer.ViewerCore.HandleExceptionEvent(Object eventSource, Exception e, Boolean suppressMessage)
   at SAPBusinessObjects.WPF.Viewer.MainReportDocument.Export(ExportRequestContext context, String filePath)
   at SAPBusinessObjects.WPF.Viewer.ReportAlbum.<>c__DisplayClass4.<ExportReport>b__3()
   at SAPBusinessObjects.WPF.Viewer.DelegateMarshaler.<>c__DisplayClass29.<QueueOnThreadPoolThread>b__28(Object )
   at System.Threading.QueueUserWorkItemCallback.WaitCallback_Context(Object state)
   at System.Threading.ExecutionContext.RunInternal(ExecutionContext executionContext, ContextCallback callback, Object state, Boolean preserveSyncCtx)
   at System.Threading.ExecutionContext.Run(ExecutionContext executionContext, ContextCallback callback, Object state, Boolean preserveSyncCtx)
   at System.Threading.QueueUserWorkItemCallback.System.Threading.IThreadPoolWorkItem.ExecuteWorkItem()
   at System.Threading.ThreadPoolWorkQueue.Dispatch()
   at System.Threading._ThreadPoolWaitCallback.PerformWaitCallback()

我的問題是拼寫 區分大小寫! 很少有列正確排序,其余列拋出此錯誤!

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM