2009-07-18 12 views
3

Il s'agit d'un programme de base inverse de chaîne et je veux y faire un certain niveau de gestion des exceptions. Mais lors de la compilation, il me donne une erreur « tous les chemins de code valeur de retour. Je ne suis pas en mesure de savoir pourquoiobtenir l'erreur pas tous les chemins de code retournent la valeur par le compilateur 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); 
      } 
     } 

Merci les gars ... Je change le code à quelque chose comme ça

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

Petite critique sur votre 2ème version: Si le paramètre est nul, vous devez soit jeter ou de retourner une chaîne vide. La propagation de null n'est pas très utile (dans cette situation). –

Répondre

4

Si une exception se produit, alors il n'y a pas d'instruction de retour en cours d'exécution.Marchez-le

Le meilleur remède (mon choix) serait de supprimer l'ensemble try/catch.Une fonction utilitaire comme Reverse ne devrait pas gérer (son propre) exceptions

+0

alors où dois-je gérer la condition pour les chaînes vides et vides? – Learner

+0

@Learner: J'ai répondu que ci-dessous –

+0

Apprenant, Revers vérifie son argument (OK) mais il ne devrait pas gérer (consommer) cette erreur par lui-même. C'est un signal au code (appelant) qui a fourni le mauvais argument. Et où Console.Writeline va-t-il dans un programme ASP.NET ou Windows? Reverse ne doit pas supposer quoi que ce soit sur le type d'application. –

2

Vous devez renvoyer une chaîne de la clause catch ainsi que de la clause try (soit, ou lever une exception) - pour l'instant vous n'avez pas de return dans votre clause catch.

4

Si vous lancez une exception avant l'instruction return, le gestionnaire catch est appelé. Après l'exécution du gestionnaire de capture, il le passe (puisqu'il n'y a pas d'instruction return ou throw), auquel cas il atteint la fin de la méthode sans renvoyer de valeur.

Edit 2 (bug majeur): Vous jetez un ArgumentNullException et procede pour l'attraper et "manger", donc il est inutile (sous cette forme). Vous devriez effectuer la validation de votre paramètre avant d'entrer dans un bloc try, plus cette méthode ne devrait pas utiliser de bloc try (cela le rendra plus lent sans raison valable).

Edit: sur une note de côté:

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

Le bloc try ne le ralentit pas. –

+0

Il est moins probable que le X64 JIT produise un code entièrement optimal. (ne peut pas trouver le lien que je recherchais et je dois courir pour voir HP!) –

+0

+1, Utiliser 'Array.Reverse' est plus propre * et * plus rapide que n'importe laquelle des autres suggestions.(Eh bien, c'était plus rapide dans une poignée de benchmarks rapide et sale que je viens d'essayer.) – LukeH

2

Dans votre bloc catch vous soit besoin de retourner une chaîne ou lancer une exception.

+0

La manière la plus simple de faire ceci est d'ajouter un "lancer"; ligne après votre Console.WriteLine. – Jacob

1

Je pense que la vraie question est de savoir comment voulez-vous gérer une chaîne entrée vide ou vide. Si vous pensez que votre méthode doit gérer cela en "corrigeant" silencieusement, vous pouvez retourner String.Empty. Toutefois, si vous pensez que les méthodes d'appel doivent traiter cette erreur, il est préférable de lancer une exception et de ne pas l'intercepter. Quel que soit votre choix, vous ne devriez pas avoir besoin du bloc 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

Je retournerais String.Empty, il n'y a rien de mal à demander l'inverse d'une chaîne vide. Vous voudrez peut-être traiter différemment. –

1

Une façon plus propre de le faire pourrait être le suivant

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, L'utilisation de 'Array.Reverse' est plus propre * et * plus rapide que toutes les autres suggestions. (Eh bien, c'était plus rapide dans une poignée de benchmarks rapide et sale que je viens d'essayer.) – LukeH

Questions connexes