获取错误并非所有代码路径都通过c#编译器返回值

这是一个基本的字符串反向程序,我想在其中进行一定程度的exception处理。 但在编译期间它给了我一个错误“没有所有代码路径返回值。我无法找出原因

public static string Reverse(string s) { try { if (string.IsNullOrEmpty(s)) { throw new NullReferenceException(); } char[] c = s.ToCharArray(); int start = 0; int end = c.Length - 1; char temp; while (start < end) { temp = c[start]; c[start] = c[end]; c[end] = temp; start++; end--; } return new string(c); } catch (Exception ex) { Console.WriteLine(ex.Message); } } 

谢谢你们……我把代码改成了这样的东西

  public static string Reverse(string s) { if (!string.IsNullOrEmpty(s)) { char[] c = s.ToCharArray(); int start = 0; int end = c.Length - 1; char temp; while (start < end) { temp = c[start]; c[start] = c[end]; c[end] = temp; start++; end--; } return new string(c); } else return s; } 

如果发生exception,则不会执行返回语句。 走过去。

最好的补救措施(我的选择)是删除整个try / catch。 像Reverse这样的实用程序函数不应该处理(它自己的)exception。

如果在return语句之前抛出exception,则调用catch处理程序。 catch处理程序执行后,它会超过它(因为它中没有returnthrow语句),此时它到达方法的末尾而不返回值。

编辑2(主要错误):你抛出一个ArgumentNullException ,并继续捕捉它并“吃掉”它,所以它没有意义(以这种forms)。 你应该在进入try块之前进行参数validation,而且这个方法根本不应该使用try块(它会让它变慢而没有任何用处)。

编辑:旁注:

 char[] characters = s.ToCharArray(); Array.Reverse(characters); return new string(characters); 

你必须从catch子句以及try子句中返回一个字符串(或者,或者引发一些exception) – 现在你的catch子句中没有return

在catch块中,您需要返回一个字符串或抛出exception。

我认为真正的问题是你想如何处理输入的空字符串或空字符串。 如果你认为你的方法应该通过静默“纠正”来处理它,你可以返回String.Empty。 但是,如果您认为调用方法应该处理此错误,那么抛出exception而不捕获它似乎是适当的操作过程。 无论你选择哪一个,你似乎都不需要try / catch块。

 public static string Reverse(string s) { if (String.IsNullOrEmpty(s)) { //option 1 return String.Empty; //option 2 throw new NullReferenceException(); } //rest of method } 

更简洁的方法可能如下

 static void Main(string[] args) { string reverseMe = "hello world"; string reversed = ReverseString(reverseMe); Console.WriteLine(reversed); } private static string ReverseString(string reverseMe) { if (String.IsNullOrEmpty(reverseMe)) return String.Empty; char[] reverseMeArray = reverseMe.ToCharArray(); Array.Reverse(reverseMeArray); string result = new string(reverseMeArray); return result; }