提问人:TamaraL96 提问时间:8/3/2018 最后编辑:johnny 5TamaraL96 更新时间:8/3/2018 访问量:303
空对象检测
Null object detection
问:
在我的拖放列表视图中,我通过以下方式收集拖放文件:
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;
}
}
答:
我敢肯定,昨天我们已经为你回答了这个问题。在对列表项执行任何操作之前,需要检查它们。根据 Abion47 为您链接的文档,您将获得 null 值。
字符串是可为 null 的类型,因此昨天给出的答案仍然成立。如果您不喜欢围绕 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 的文档在这里
它指出它将尝试将其转换为您需要的任何格式。如果不能,则返回 null。昨天你想转换为字符串数组(DataFormat.FileDrop),但它会失败。
今天,您正在尝试转换为对象,并在同一个地方收到相同的错误。您仍在尝试将其转换为,这就是它返回 null 的地方。您仍然要求转换为,但不能。DataFormats.FileDrop
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;
}
评论
s.Equals(null)
s
Equals(s, null)
s == null
static
s is null