空对象检测
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;
}
在我的拖放列表视图中,我通过以下方式收集拖放的文件:
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;
}
}
我相信我们已经为您解答了很多问题
字符串是可空类型,所以昨天给出的答案仍然成立。如果您不喜欢围绕 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;
}