空对象检测

时间:2018-08-02 17:48:32

标签: c# arrays winforms nullreferenceexception nullable

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

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

我也可以强制执行此操作,并获得所有拖放文件的路径:

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

它工作正常,但是当我从Webbrowser中拖放“ MyComputer”或其他内容时,我的程序将抛出nullfrefferenceexception。

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

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;
        }
   }

1 个答案:

答案 0 :(得分:0)

我相信我们已经Yesterday为您解答了很多。在对它们进行任何操作之前,您需要检查它们。根据Abion47为您链接的文档,您会得到零回报。

字符串是可为空的类型,因此昨天给出的答案仍然成立。如果您不喜欢尝试遍历ListViewItem的创建,则可以始终按照上面的操作进行操作,首先检查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

它指出它将尝试将其转换为所需的任何格式。如果不能,则将返回null。昨天您想转换为字符串数组(DataFormat.FileDrop),它将失败。

今天,您正试图转换为对象,并且在同一位置遇到相同的错误。您仍在尝试将其转换为DataFormats.FileDrop,这就是它返回null的地方。您仍在要求GetData转换为DataFormats.FileDrop,但不能转换。

RecycleBin和Desktop是特殊目录,我假设DrapDrop无法处理它们,因此转换失败并且返回null。

我尝试过:

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

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

System.Windows.Forms.DataObject

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

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

这将检查是否可以将数据格式化为所需的类型。但这无法告诉您实际上是哪种数据!

可悲的是,无论您做什么,包括RecycleBin或Desktop都将始终转换失败。

您始终可以检查它是否可以转换以及是否不会向您的用户弹出一条消息,告知他们不要尝试丢弃回收站/桌面:

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