получая ошибку не все пути кода возвращают значение компилятором c # - PullRequest
3 голосов
/ 18 июля 2009

Это базовая программа обратного преобразования строк, и я хочу сделать в ней некоторый уровень обработки исключений. Но во время компиляции выдает ошибку «НЕТ, все пути кода возвращают значение. Я не могу выяснить, почему

 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;


        }

Ответы [ 6 ]

4 голосов
/ 18 июля 2009

Если вы генерируете исключение перед оператором return, вызывается обработчик catch. После выполнения обработчика перехвата он проходит за ним (поскольку в нем нет оператора return или throw), и в этот момент он достигает конца метода без возврата значения.

Редактировать 2 (серьезная ошибка): Вы бросаете ArgumentNullException и продолжаете ловить его и «съесть», так что это бессмысленно (в этой форме). Вы должны выполнить проверку параметров перед входом в блок try, плюс этот метод вообще не должен использовать блок try (это сделает его медленнее без какой-либо полезной причины).

Редактировать: на заметке:

char[] characters = s.ToCharArray();
Array.Reverse(characters);
return new string(characters);
4 голосов
/ 18 июля 2009

Если возникает исключение, то оператор return не выполняется. Пройдите через это.

Лучшее средство (мой выбор) - удалить всю попытку / улов. Утилита типа Reverse не должна обрабатывать (свои) исключения.

2 голосов
/ 18 июля 2009

В вашем блоке catch вам нужно либо вернуть строку, либо выдать исключение.

2 голосов
/ 18 июля 2009

Вы должны вернуть строку из предложения catch, а также из предложения try (либо это, либо вызвать какое-то исключение) - сейчас у вас нет return в вашем catch пункт.

1 голос
/ 18 июля 2009

Более чистый способ сделать это может быть следующим:

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;
}
1 голос
/ 18 июля 2009

Я думаю, что реальный вопрос в том, как вы хотите обрабатывать введенную нулевую или пустую строку. Если вы считаете, что ваш метод должен справиться с этим путем «исправления», вы можете вернуть 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
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...