2009-07-18 3 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 전체를 제거하는 것입니다. Reverse와 같은 유틸리티 함수는) 예외.

+0

그래서 null 및 빈 문자열에 대한 조건을 처리해야합니까? – Learner

+0

@Learner : 나는 대답을 –

+0

아래로 대답했다. Revers는 그것을 확인 (OK)하지만 그 자체로 그 오류를 처리 (소비)하면 안된다. 나쁜 인수를 제공 한 코드 (발신자)에게 신호입니다. 그리고 Console.Writeline은 ASP.NET이나 Windows 프로그램에서 어디로 이동합니까? Reverse는 응용 프로그램 유형에 대해 아무 것도 가정하지 않아야합니다. –

2

catch 절뿐 아니라 try 절에서 문자열을 반환해야합니다. (그 중 하나 또는 예외를 발생시킵니다.) catch 절에 return이 없습니다.

4

return 문 앞에 예외가 발생하면 catch 처리기가 호출됩니다. catch 핸들러가 실행 된 후 (아무런 return 또는 throw 문이 없기 때문에) 처리기가 실행되면 값을 반환하지 않고 메서드의 끝에 도달합니다.

편집 2 (주요 결함) :ArgumentNullException을 던지고 그것을 잡아 먹고 먹습니다. 따라서이 양식에서는 무의미합니다. try 블록을 입력하기 전에 매개 변수 유효성 검사를 수행해야하며,이 방법은 try 블록을 전혀 사용하지 않아야합니다 (유용하지 않은 이유로 속도가 느려집니다).

편집 : 보조 노트에 : 당신의 catch 블록에서

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

try 블록으로 인해 속도가 느려지지 않습니다. –

+0

X64 JIT에서 완벽하게 최적의 코드를 생성 할 가능성이 적습니다. (링크를 찾지 못해 HP를보기 위해 달려야합니다!) –

+0

+1,'Array.Reverse'를 사용하면 다른 제안들보다 더 빠르고 * 빠릅니다.(글쎄, 방금 시도한 신속하고 지저분한 벤치 마크에서 더 빨랐다.) – LukeH

2

당신도 문자열을 반환하거나 예외를 던질 필요가있다.

+0

가장 쉬운 방법은 "throw;"를 추가하는 것입니다. 당신의 Console.WriteLine 뒤에 라인. – Jacob

1

실제 질문은 입력 된 null 또는 빈 문자열을 어떻게 처리하려고하는지입니다. 만약 당신이 당신의 방법이 자동으로 "수정"하여 이것을 처리해야한다고 생각한다면 String.Empty를 반환 할 수 있습니다. 그러나 호출하는 메서드가이 오류를 처리해야한다고 생각하면 예외를 throw하고 catch하지 않는 것이 적절한 조치 과정처럼 보입니다. 아무리 선택해도 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를 반환 할 것이고, 빈 문자열의 역순을 묻는 데는 기본적으로 잘못된 것이 없습니다. 당신은 다르게 널을 대우하고 싶을지도 모르다. –

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

관련 문제