空对象检测

Null object detection

在我的拖放列表视图中,我通过以下方式收集拖放的文件:

var objects=Data.GetData(DataFormats.FileDrop, false);

我也可以投这个,我得到所有拖放文件的路径:

string[] DroppedDirectories = (string[])e.Data.GetData(DataFormats.FileDrop, false);

它工作正常,但是当我从 Webbrowser 拖放 "MyComputer" 或其他内容时,我的程序抛出 nullfreferenceexception。

我的问题是下面获取数据方法的确切 return 值是多少(当我在一瞬间拖放几个文件时)?:

Data.GetData(DataFormats.FileDrop, false);

我假设我必须检查每个对象并消除空对象(然后我可以将没有空对象的数组转换为字符串 [] 并且在进一步处理期间我得到正确的路径并且没有 NRexceptions)。

此代码仍然抛出 System.NullRefferenceException:

private void Directories_ListView_DragDrop(object sender, DragEventArgs e)
{
    object[] rawArray=(object[])e.Data.GetData(DataFormats.FileDrop, false);
    foreach (var s in rawArray)\System.NullRefferenceException occurs..
    {
        try
        {
            if (!s.Equals(null))
            {
                LogList.Items.Add(DateTime.Now + " Item isnt Null");
            }
        }
        catch (Exception)
        {
            LogList.Items.Add(DateTime.Now + " Item is null");
            continue;
        }
   }

我相信我们已经为您解答了很多问题 。在对列表项进行任何操作之前,您需要检查它们。根据 Abion47 为您链接的文档,您将得到一个空值。

字符串是可空类型,所以昨天给出的答案仍然成立。如果您不喜欢围绕 ListViewItem 创建的 try catch,您始终可以像上面那样先检查 null。

if (e.Data.GetData(DataFormats.FileDrop, false) != null)
{
    string[] DroppedDirectories = (string[]) e.Data.GetData(DataFormats.FileDrop,false);
    List<string> directories = new List<string>();
    foreach(string dir in DroppedDirectories)
    {
        if (dir != null)
            directories.Add(dir);
    }

    // Now loop over the directories list which is guaranteed to have valid string items
}

GetData 的文档是 here

它声明它将尝试将其转换为您需要的任何格式。如果不能,那么它将 return 为空。昨天您想转换为字符串数组 (DataFormat.FileDrop),但它会失败。

今天您尝试转换为对象,但在同一个地方遇到了同样的错误。您仍在尝试将其转换为 DataFormats.FileDrop,这就是它 returning null 的地方。您仍在要求 GetData 转换为 DataFormats.FileDrop 但它不能。

RecycleBin 和 Desktop 是特殊目录,我认为 DrapDrop 无法处理它们,因此转换失败并且 return 为空。

我试过:

var ob = e.Data.GetData(typeof(object));

并且当您包含回收站时它仍然 return 为空。如果您尝试获取数据 e.Data.GetType() 的数据类型,您会发现数据的类型为:

System.Windows.Forms.DataObject

您可以像以前一样或使用以下方法防止空崩溃:

if (e.Data.GetDataPresent(DataFormats.FileDrop)

这会检查是否可以将数据格式化为您想要的类型。但是它不能告诉你里面到底是什么类型的数据!

遗憾的是,无论您做什么,包含 RecycleBin 或 Desktop 似乎总是会导致转换失败。

您始终可以检查它是否转换以及是否不向您的用户弹出一条消息,告知他们不应尝试放弃回收 bin/desktop:

if (!e.Data.GetDataPresent(DataFormats.FileDrop)
{
    MessageBox("Please don't drop Recycle Bin or Desktop");
    return;
}