NullReferenceException未捕获到catch块(Array.Sort方法)

时间:2013-10-25 11:19:59

标签: c# exception msdn

try
{
    Array.Sort(PokeArray, (x1, x2) => x1.Name.CompareTo(x2.Name));
}
catch (NullReferenceException R)
{
    throw R;
}

这是一个简单的代码行,可以对我创建的对象数组进行排序;如果存在空值,则会引发异常。 try catch块似乎不起作用。

此特定区域x1.Name.CompareTo(x2.Name)发生异常,Catch块是否放错位置?

谢谢!

3 个答案:

答案 0 :(得分:3)

不,看起来不错。但是你 重新抛出异常之后就抓住了它; Throw R表示将异常传递给最初调用try-catch的代码块。

try
{
    Array.Sort(PokeArray, (x1, x2) => x1.Name.CompareTo(x2.Name));
}
catch (NullReferenceException R)
{
    // throw R; // Remove this, and your exception will be "swallowed". 

    // Your should do something else here to handle the error!
}

更新

首先,将您的屏幕截图链接添加到原始帖子 - 它有助于澄清您的问题。 :)

其次,您的try-catch 捕获异常 - 只是在您处于调试模式时。如果在该行之后继续步进,则应该能够继续执行try-catch子句,并且程序应该继续。

如果未捕获您的例外,它将终止该程序。

PS :从VS的主菜单中选择DebugExceptions..,并确保没有为任何列选中“投掷” - 如果您这样做,您的程序将暂停并显示发生的任何异常,而不是仅仅“吞咽”它们。

答案 1 :(得分:0)

在您的情况下,代码不会抛出NullReferenceException,因为当您致电NullReferenceException时,默认的Compare方法实施会吞下Array.Sort()。此异常将以InvalidOperationException向下传播。这就是您跳过NullReferenceException catch块的原因。您可以使用以下简单示例重现整个场景,其中我故意将null作为集合元素包含。

public class ReverseComparer : IComparer<string>
{
    public int Compare(string x, string y)
    {
     return y.CompareTo(x); //Here the logic will crash since trying to compare with   null value and hence throw NullReferenceException
    }
}

public class Example
{
    public static void Main()
    {
        string[] dinosaurs =
            {
               "Amargasaurus",
                null,
                "Mamenchisaurus",

            };

        Console.WriteLine();
        foreach (string dinosaur in dinosaurs)
        {
            Console.WriteLine(dinosaur);
        }

        ReverseComparer rc = new ReverseComparer();

        Console.WriteLine("\nSort");
        try
        {
            Array.Sort(dinosaurs, rc); //Out from here the NullReferenceException propagated as InvalidOperationException.
        }
        catch (Exception)
        {

            throw;
        }

    }
}

答案 2 :(得分:0)

您可以让代码更好地处理空值。例如。如果所有值都可以为null,则应该包含以下内容:

if (PokeArray != null)
    Array.Sort(PokeArray, (x1, x2) =>
      string.Compare(x1 != null ? x1.Name : null, x2 != null ? x2.Name : null));

如果您不希望其中某些值为null,则可以通过删除不必要的空值检查来使代码更简单。