2013-10-25 40 views
1
try 
{ 
    Array.Sort(PokeArray, (x1, x2) => x1.Name.CompareTo(x2.Name)); 
} 
catch (NullReferenceException R) 
{ 
    throw R; 
} 

这是一个简单的代码行,它对我创建的对象数组进行排序;如果存在空值,则会引发异常。 try catch块似乎不起作用。NullReferenceException未捕获到catch块(Array.Sort方法)

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

谢谢!

+1

如果你想捕捉一个异常并重新抛出它,你应该__always__使用'throw;'而不是'throw ex;'来避免丢失异常的原始堆栈跟踪。 –

+0

感谢您的快速回复,我只使用thow,它似乎仍然给我同样的错误突出显示相同的区域是这样的:“x1.Name.CompareTo(x2.Name)”说NullReferenceException没有被捕获,谢谢! –

+0

尝试捕捉一个普通的异常,看看它是否像'catch(Exception ex)'一样工作'我知道这很糟糕,但只是为了看到。 – Tafari

回答

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..,并确保你没有“时抛出”检查是否有列 - 如果你这样做,你的程序将暂停,并显示发生任何异常,而不是像其他人那样“吞食”它们。

+0

感谢您的回复,似乎即使我不重新抛出它,错误仍然存​​在。 –

+0

谢谢,但即使这不起作用,这是一个截图,如果它有帮助:http://i497.photobucket。com/albums/rr333/Dialga1000/NullReferenceExeptionWeird.png –

+0

它如何持续?如果它是'NullReferenceException',它应该被捕获。如果没有,请检查该异常是否属于该类型。这仍然不能解决你原来的逻辑错误 - 只是“吞下”(隐藏)错误。您最好先解决原始问题:删除(或忽略)包含'null'的对象。 – Kjartan

0

在你的情况下,由于NullReferenceException是被Compare方法的默认实现吞噬,当你调用Array.Sort()的代码不会抛出NullReferenceException。这个异常传播为InvalidOperationException下线。这就是为什么你的NullReferenceException catch块跳过。您可以通过以下简单示例重现整个场景,其中我有目的地将null包含为collection元素。

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

    } 
} 
+0

在catch块中使用“Exception”似乎现在工作,但现在名称以“C”后的任何字母开头,在数据结构中输入的最后一个名称是“Chespin”,之后的所有名称都未填充到通过此数组填充的列表框中,谢谢! –

0

你可以让你的代码更好地处理空值。例如。如果所有的值可能是零,这应包括您:

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

如果你不希望其中的一些价值观永远为空,可以通过删除不必要的null检查使代码更简单。

+0

谢谢,这似乎消除了错误,但是,我填充使用此数组的列表框似乎现在为空(使用“名称”成员填充它),我的数据结构是这样的,我可以保证没有空值,甚至使其工作,但我只是好奇,如果我不知道什么时候或哪里会出现空值,我会怎么做。 –

相关问题