Pourquoi Chaîne.indexOf n'utilisez pas d'exception mais retournent -1 en cas de sous-chaîne n'est pas trouvée?
Pourquoi Chaîne.indexOf n'utilisez pas d'exception mais retournent -1 en cas de sous-chaîne n'est pas trouvée?
Le but de cette question est que lorsque nous commençons exception personnalisée.
Je crois éviter le besoin de retourner spécial code d'erreur est le droit de la conception de chemin d'accès.
Quelle est votre opinion?
Comme vous pouvez le voir à partir des réponses, personne ne pense que ce devrait être une exception. Demandez-vous, si il est revenu Entier au lieu de int, attendez-vous à retourner la valeur null, ou lever une exception. Puisqu'il s'agit d'une primitive, null n'est pas disponible comme un type de retour, donc -1 est utilisée à la place.
si c'retour Entier de l'objet. la valeur null est possible. reportez-vous à MSFT.net 2.0 , int? est la bonne solution
si c'retour Entier de l'objet. la valeur null est possible. reportez-vous à MSFT.net 2.0 , int? est la bonne solution
OriginalL'auteur ariso | 2009-05-13
Vous devez vous connecter pour publier un commentaire.
En règle générale, si le but de cette méthode est de vérifier pour quelque chose, alors le manque de que quelque chose ne devrait pas être une exception. Si la méthode est en supposant que quelque chose est vrai, alors l'absence de ce quelque chose serait une exception. Ainsi, "Fichier.exists()" ne pas jeter un FileNotFoundException, mais "Fichier.open()" ne.
OriginalL'auteur Paul Tomblin
exceptions pour des cas exceptionnels, lorsqu'une chaîne de caractères ne contient pas une lettre, c'est loin d'être exceptionnel, sauf si vous l'utilisez pour certains cas extrêmes. Si c'est ce que vous faites, vous pouvez toujours choisir de lancer votre propre exception.
C'est peut-être considéré comme tout à fait normal pour un fichier n'existe pas, sinon pourquoi avoir une méthode de test pour elle, plutôt que de simplement supposer que le fichier que vous demandez est en cours d'être là.
OriginalL'auteur z -
Dernière, j'ai entendu sur qui était...
+1 pour Paul. Il ressort de la citation ci-dessus, Tous les résultats possibles/les valeurs de retour dans le cas où la méthode réussit doit pas prendre la forme d'une exception. La méthode ne doit lever une exception pour indiquer qu'il a été incapable d'accomplir son devoir/raison d'être.
La faute est sur la Chaîne de côté (car il n'a pas à la Chaîne de recherche), et non pas sur la méthode côté.
Je suis confus. dans votre commentaire, je pense que IndexOf ont pour lancer une exception, car il promet de revenir l'indice d'une chaîne. Peut-être SearchOf peut retourner la valeur null ou -1 et IndexOf va jeter l'exception est le meilleur?
pas sûr que je comprends. IndexOf est utilisé pour trouver la position de certains X. Si ce n'est pas en mesure de trouver X dans la chaîne, il n'est pas un échec de la méthode.. la méthode a fait son travail. Il n'a tout simplement pas findX. Cela contraste avec un cas où la méthode n'est pas en mesure d'exécuter avec certaines d'entrée donnée; dans ce cas, la méthode n'est pas capable de faire son travail et que les signaux avec une exception. Chaque fois que vous recherchez quelque chose, vous devez vérifier dans le cas où il n'est pas trouvé, Vous ne devriez pas avoir à utiliser les exceptions pour le contrôle du flux.
OriginalL'auteur Gishu
de retour -1 est presque aussi horrible que de lancer une exception. La bonne façon serait d'utiliser le type de l'option si le langage juste pris en charge au mieux. En situation normale, où il est le résultat, vous mettez le résultat dans l'objet et le renvoyer. Sinon vous retourner un objet représentant le "pas de résultat" de la situation.
En appel site, vous avez pour vérifier quelle était-elle; vous ne pouvez pas utiliser la valeur de retour en raison de leur super-type, ils doivent être inspectés par filtrage.
Pseudo syntaxe:
où a est le paramètre de type générique, Certaines représente un résultat de valeur et Aucune non-résultat sans valeur.
dans indexOf cas, vous avez:
et vous l'utiliser de cette façon:
Si vous avez omis une partie ou Aucun à partir de la correspondance (qui est un peu généralisé de l'interrupteur), le compilateur ne vous donner un avertissement.
Une Exception ne passera pas inaperçu, mais il est possible que la logique du programme en silence à aller de travers, lorsque vous faites affaire avec un certain nombre. Plus -1 ne soit pas à la lisibilité de la valeur. Juste une valeur arbitraire.
Je suis d'accord. jeter l'exception sera de rendre le code plus complet et pas facile à comprendre....
Eljenso, car il n'y a pas de sens derrière elle, elle pourrait aussi bien être -3424. Encore un autre nombre magique qu'un souvenir.
À partir d'un point de vue pratique, je ne suis pas d'accord. -3424 est beaucoup plus difficile à retenir. Notez que les indices en Chaîne sont basés sur zéro, donc si vous retournera un entier pour représenter quelque chose "en dehors" de la gamme d'une Chaîne de caractères de longueur 0<=n, -1 semble un enfer de beaucoup mieux que -3424. Serait-il ok pour vous si l'indice de caractères dans une Chaîne de caractères à partir de -3424? Après tout 0 (ou 1) sont des nombres arbitraires ainsi...
OriginalL'auteur egaga
C'est beaucoup plus facile de traiter avec la fonction de vérification pour un -1 de l'interception d'une exception.
OriginalL'auteur Gromer
Aussi car les exceptions sont coûteux en termes de performances
OriginalL'auteur user61491
Outre les arguments contre exceptions en général, je voudrais ajouter que -1 peut être un résultat utile de indexOf et lastIndexOf, et pas seulement une valeur particulière. Par exemple, pour analyser le nom de fichier à partir d'une chaîne de caractères qui peut ou peut ne pas contenir un chemin d'accès:
Tout peut-être un exemple artificiel, ce serait un peu plus lourd avec des exceptions.
Un hack? Utile la valeur de retour n'est pas un hack. Un commentaire? Qu'aimeriez-vous ajouter qui n'est pas déjà indiqué dans la JavaDoc de ces (simple) fonctions?
Je suis d'accord que le "hack" peut-être un peu fort. Mais en regardant le code n'a PAS des intentions claires. Un autre programmeur pourrait très facilement regarder ceci et pense que l'auteur de "raté" le pas de '/' cas. Intelligent et facile à entretenir ne vont pas toujours de pair.
OriginalL'auteur Chris Thornhill
Beaucoup de bonnes réponses ici. C'est un problème de conception où le pragmatisme l'a emporté sur la suite des "règles". Dans ce cas, il y a quelques contradictoires "règles":
vs
Je suis d'accord avec cette décision de conception. Si vous ne le faites pas, cependant, vous pouvez toujours écrire votre propre code pour vérifier l'existence d'une chaîne de caractères avant de vérifier son index. Ne pas être prisonnier de votre langue, de la plier à votre volonté. Les langues sont destinés à être torturé!
OriginalL'auteur RedFilter
Je pense que l'on doit lancer une exception quand quelque chose inattendu qui se passe.
Cela dit, une sous-chaîne ne trouve pas dans une Chaîne de caractères n'est pas inattendu, peut arriver, c'est un résultat raisonnable.
Je suis d'accord avec vous qu'il faut essayer d'éviter le retour des codes d'erreur, mais dans ce cas, nous n'avons que deux choix, chaîne ou une chaîne introuvable.
OriginalL'auteur Alberto Zaccagni
Jusqu'à ce que l'auteur de Java
string.indexOf
nous raconte l'histoire réelle...Supposons que nous avons eu à les concevoir à partir de zéro, certaines évidentes contraintes de conception pour résoudre ce problème:
indexOf
doit retourner une valeur numérique, de sorte que lorsqu'une correspondance est trouvée, vous savez où il estCompte tenu de ces contraintes de base, quelques choix possibles pour la fonction type de retour de l'être entier (idéalement, d'un type assez grand pour représenter le dernier index dans la plus grande possible de la chaîne), OU...
Object
(et peut-être retourner la valeur null pour indiquer pas trouvé). Mais, dans la pratique, le retourObject
ne serait ni efficace ni convivial, en raison de la nécessité de vérifier la validité et de la fonte avant l'utilisation, pour la trouvé de cas - il n'est donc pas vraiment une option viable!Alors allons-y avec un entier. Voulons-nous pour lancer une exception si elle ne trouve pas? De lever des exceptions a plusieurs ses propres problèmes - la création d'objets d'exception et de sauter à des gestionnaires d'exception peut être tout à fait inefficace, et l'écriture des blocs try/catch autour de
indexOf
appels n'est pas drôle!!!!Donc, disons que nous avons rétréci vers le bas: elle doit retourner un (signé) de type entier, et pas lever une exception. Maintenant de la valeur entière devrait-il retourner à l'représentent pas trouvé?
Afin de permettre la recherche dans les chaînes aussi grande que possible, nous devrions réserver tous les entiers positifs pour l'utilisation en ce sens trouvée. À l'inverse, aucun des nombres négatifs est nécessaire pour représenter un "trouvé" de l'indice, de sorte que tous sont potentiellement disponibles pour l'utiliser comme retour de codes représentant des "non trouvé".
Si nous pouvions avoir choisi un nombre négatif, pour représenter n'est pas trouvé, ou tout simplement dit "tous négatives valeurs de retour signifie pas trouvé", celui-ci faire le travail... Mais serait-il le meilleur design?
Ce sont quelques raisons d'utiliser -1 à la place des autres nombres négatifs? Mon préféré raisons sont simplement '-1 est facile pour tout le monde de se souvenir, et vous pouvez le faire exacte de l'égalité des tests sur elle". (Au lieu d'être obligé d'utiliser des inégalités et de penser à tout-en-un des problèmes comme si vous voulez inférieur ou inférieur ou égal, et de la valeur à comparer avec, nul ou négatif)
J'ai aussi parfois admirer de Chris raison que (paraphrase) " il fonctionne bien avec
substring(foundIndex + 1)
'.OriginalL'auteur Tim Lovell-Smith