2009-07-18 10 views
3

これは基本的な文字列逆プログラムであり、ある程度のレベルの例外処理を行いたいと思います。しかし、コンパイル時に、それはすべてのコードパスが値を返さない」私にエラーが発生します。私は、なぜすべてのコードパスがC#コンパイラによって値を返すわけではありません

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; 


     } 
+1

小批評を次のようにそれはあるかもしれないやってのクリーンな方法:パラメータがnullの場合は、投げたり、空の文字列を返す必要がありますどちらか。 nullを伝播することはあまり役に立ちません(この場合)。 –

答えて

4
のようなものにコードを変更します

例外が発生した場合、return文は実行されません。

私の選択肢は、try/catch全体を削除することです。 )例外。

+0

nullと空文字列の条件はどこで処理する必要がありますか? – Learner

+0

@Learner:私は –

+0

以下と答えました。学習者は、Reversが引数(OK)をチェックしますが、そのエラーを自己が処理(消費)してはいけません。それは悪い議論を提供したコード(発呼者)へのシグナルです。そして、Console.WritelineはASP.NETやWindowsプログラムのどこに行きますか? Reverseは、アプリケーションタイプについて何も想定すべきではありません。 –

2

catch句とtry句のいずれかの文字列を返す必要があります(その場合、または例外を発生させます)。今すぐcatch句にreturnがありません。

4

return文の前に例外をスローすると、catchハンドラが呼び出されます。キャッチハンドラが実行された後は、(それにはreturnまたはthrowというステートメントが含まれていないため)、その時点で値を返さずにメソッドの最後に到達します。

編集2(メジャーバグ):ArgumentNullExceptionを投げて、それを捕まえて食べるので、このフォームでは無意味です。 tryブロックを入力する前にパラメータの検証を行う必要があります。また、この方法ではtryブロックを使用するべきではありません(それは役に立たない理由で遅くなります)。

編集:サイドノートで:あなたのcatchブロックで

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

tryブロックはそれを遅くしません。 –

+0

X64 JITが完全に最適なコードを生成する可能性は低くなります。 –

+0

+1、Array.Reverse'は、他の提案のどれよりも速く*クリーンで*である '使い方(私が後だったと私はHPを参照するために実行する必要があります!リンクを見つけることができません)。(ちょうど私が試した素早く簡単なベンチマークのほうが速かったです) – LukeH

2

あなたはいずれかの文字列を返すか、例外をスローする必要があります。

+0

これを行う最も簡単な方法は、 "throw;"を追加することです。あなたのConsole.WriteLineの後の行。 – Jacob

1

実際の質問は、入力されたnullまたは空の文字列をどのように処理したいのかと思います。あなたのメソッドが静かに "修正"することでこれを処理する必要があると思われる場合は、String.Emptyを返すことができます。しかし、呼び出し側のメソッドがこのエラーを処理する必要があると考えている場合は、例外をスローしてキャッチしないようにしてください。それに関係なく、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 
} 
+1

私はString.Emptyを返すでしょう、主に空の文字列の逆を求めて間違っている何もありません。あなたはnullを別の方法で扱いたいかもしれません。 –

1

あなたの第二のバージョンに

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

+1、 'Array.Reverse'を使うことは、他の提案よりもクリーンで*かつ*高速です。 (ちょうど私が試した、手早く簡単なベンチマークでした。) – LukeH

関連する問題